10
10
using Microsoft . Extensions . DependencyInjection ;
11
11
using Microsoft . Extensions . Logging ;
12
12
using Microsoft . Extensions . Logging . Abstractions ;
13
- using Moq ;
14
13
using Xunit ;
15
- using Microsoft . AspNetCore . Components ;
16
14
17
15
namespace Microsoft . AspNetCore . Components . Test . Routing
18
16
{
@@ -42,109 +40,61 @@ public async Task CanRunOnNavigateAsync()
42
40
{
43
41
// Arrange
44
42
var called = false ;
45
- async Task OnNavigateAsync ( NavigationContext args )
43
+ Action < NavigationContext > OnNavigateAsync = async ( NavigationContext args ) =>
46
44
{
47
45
await Task . CompletedTask ;
48
46
called = true ;
49
- }
50
- _router . OnNavigateAsync = OnNavigateAsync ;
51
-
52
- // Act
53
- await _renderer . Dispatcher . InvokeAsync ( ( ) => _router . RunOnNavigateWithRefreshAsync ( "http://example.com/jan" , false ) ) ;
54
-
55
- // Assert
56
- Assert . True ( called ) ;
57
- }
58
-
59
- [ Fact ]
60
- public async Task CanHandleSingleFailedOnNavigateAsync ( )
61
- {
62
- // Arrange
63
- var called = false ;
64
- async Task OnNavigateAsync ( NavigationContext args )
65
- {
66
- called = true ;
67
- await Task . CompletedTask ;
68
- throw new Exception ( "This is an uncaught exception." ) ;
69
- }
70
- _router . OnNavigateAsync = OnNavigateAsync ;
47
+ } ;
48
+ _router . OnNavigateAsync = new EventCallback < NavigationContext > ( null , OnNavigateAsync ) ;
71
49
72
50
// Act
73
- await _renderer . Dispatcher . InvokeAsync ( ( ) => _router . RunOnNavigateWithRefreshAsync ( "http://example.com/jan" , false ) ) ;
51
+ await _renderer . Dispatcher . InvokeAsync ( ( ) => _router . RunOnNavigateAsync ( "http://example.com/jan" , false ) ) ;
74
52
75
53
// Assert
76
54
Assert . True ( called ) ;
77
- Assert . Single ( _renderer . HandledExceptions ) ;
78
- var unhandledException = _renderer . HandledExceptions [ 0 ] ;
79
- Assert . Equal ( "This is an uncaught exception." , unhandledException . Message ) ;
80
55
}
81
56
82
57
[ Fact ]
83
58
public async Task CanceledFailedOnNavigateAsyncDoesNothing ( )
84
59
{
85
60
// Arrange
86
61
var onNavigateInvoked = 0 ;
87
- async Task OnNavigateAsync ( NavigationContext args )
62
+ Action < NavigationContext > OnNavigateAsync = async ( NavigationContext args ) =>
88
63
{
89
64
onNavigateInvoked += 1 ;
90
65
if ( args . Path . EndsWith ( "jan" ) )
91
66
{
92
67
await Task . Delay ( Timeout . Infinite , args . CancellationToken ) ;
93
68
throw new Exception ( "This is an uncaught exception." ) ;
94
69
}
95
- }
96
- var refreshCalled = false ;
70
+ } ;
71
+ var refreshCalled = 0 ;
97
72
_renderer . OnUpdateDisplay = ( renderBatch ) =>
98
73
{
99
- if ( ! refreshCalled )
100
- {
101
- refreshCalled = true ;
102
- return ;
103
- }
104
- Assert . True ( false , "OnUpdateDisplay called more than once." ) ;
74
+ refreshCalled += 1 ;
75
+ return ;
105
76
} ;
106
- _router . OnNavigateAsync = OnNavigateAsync ;
77
+ _router . OnNavigateAsync = new EventCallback < NavigationContext > ( null , OnNavigateAsync ) ;
107
78
108
79
// Act
109
- var janTask = _renderer . Dispatcher . InvokeAsync ( ( ) => _router . RunOnNavigateWithRefreshAsync ( "http://example.com/jan" , false ) ) ;
110
- var febTask = _renderer . Dispatcher . InvokeAsync ( ( ) => _router . RunOnNavigateWithRefreshAsync ( "http://example.com/feb" , false ) ) ;
80
+ var janTask = _renderer . Dispatcher . InvokeAsync ( ( ) => _router . RunOnNavigateAsync ( "http://example.com/jan" , false ) ) ;
81
+ var febTask = _renderer . Dispatcher . InvokeAsync ( ( ) => _router . RunOnNavigateAsync ( "http://example.com/feb" , false ) ) ;
111
82
112
83
await janTask ;
113
84
await febTask ;
114
85
115
86
// Assert that we render the second route component and don't throw an exception
116
87
Assert . Empty ( _renderer . HandledExceptions ) ;
117
88
Assert . Equal ( 2 , onNavigateInvoked ) ;
118
- }
119
-
120
- [ Fact ]
121
- public async Task CanHandleSingleCancelledOnNavigateAsync ( )
122
- {
123
- // Arrange
124
- async Task OnNavigateAsync ( NavigationContext args )
125
- {
126
- var tcs = new TaskCompletionSource < int > ( ) ;
127
- tcs . TrySetCanceled ( ) ;
128
- await tcs . Task ;
129
- }
130
- _renderer . OnUpdateDisplay = ( renderBatch ) => Assert . True ( false , "OnUpdateDisplay called more than once." ) ;
131
- _router . OnNavigateAsync = OnNavigateAsync ;
132
-
133
- // Act
134
- await _renderer . Dispatcher . InvokeAsync ( ( ) => _router . RunOnNavigateWithRefreshAsync ( "http://example.com/jan" , false ) ) ;
135
-
136
- // Assert
137
- Assert . Single ( _renderer . HandledExceptions ) ;
138
- var unhandledException = _renderer . HandledExceptions [ 0 ] ;
139
- Assert . Equal ( "OnNavigateAsync can only be cancelled via NavigateContext.CancellationToken." , unhandledException . Message ) ;
89
+ Assert . Equal ( 2 , refreshCalled ) ;
140
90
}
141
91
142
92
[ Fact ]
143
93
public async Task AlreadyCanceledOnNavigateAsyncDoesNothing ( )
144
94
{
145
95
// Arrange
146
96
var triggerCancel = new TaskCompletionSource ( ) ;
147
- async Task OnNavigateAsync ( NavigationContext args )
97
+ Action < NavigationContext > OnNavigateAsync = async ( NavigationContext args ) =>
148
98
{
149
99
if ( args . Path . EndsWith ( "jan" ) )
150
100
{
@@ -153,7 +103,7 @@ async Task OnNavigateAsync(NavigationContext args)
153
103
tcs . TrySetCanceled ( ) ;
154
104
await tcs . Task ;
155
105
}
156
- }
106
+ } ;
157
107
var refreshCalled = false ;
158
108
_renderer . OnUpdateDisplay = ( renderBatch ) =>
159
109
{
@@ -164,11 +114,11 @@ async Task OnNavigateAsync(NavigationContext args)
164
114
}
165
115
Assert . True ( false , "OnUpdateDisplay called more than once." ) ;
166
116
} ;
167
- _router . OnNavigateAsync = OnNavigateAsync ;
117
+ _router . OnNavigateAsync = new EventCallback < NavigationContext > ( null , OnNavigateAsync ) ;
168
118
169
119
// Act (start the operations then await them)
170
- var jan = _renderer . Dispatcher . InvokeAsync ( ( ) => _router . RunOnNavigateWithRefreshAsync ( "http://example.com/jan" , false ) ) ;
171
- var feb = _renderer . Dispatcher . InvokeAsync ( ( ) => _router . RunOnNavigateWithRefreshAsync ( "http://example.com/feb" , false ) ) ;
120
+ var jan = _renderer . Dispatcher . InvokeAsync ( ( ) => _router . RunOnNavigateAsync ( "http://example.com/jan" , false ) ) ;
121
+ var feb = _renderer . Dispatcher . InvokeAsync ( ( ) => _router . RunOnNavigateAsync ( "http://example.com/feb" , false ) ) ;
172
122
triggerCancel . TrySetResult ( ) ;
173
123
174
124
await jan ;
@@ -180,16 +130,16 @@ public void CanCancelPreviousOnNavigateAsync()
180
130
{
181
131
// Arrange
182
132
var cancelled = "" ;
183
- async Task OnNavigateAsync ( NavigationContext args )
133
+ Action < NavigationContext > OnNavigateAsync = async ( NavigationContext args ) =>
184
134
{
185
135
await Task . CompletedTask ;
186
136
args . CancellationToken . Register ( ( ) => cancelled = args . Path ) ;
187
137
} ;
188
- _router . OnNavigateAsync = OnNavigateAsync ;
138
+ _router . OnNavigateAsync = new EventCallback < NavigationContext > ( null , OnNavigateAsync ) ;
189
139
190
140
// Act
191
- _ = _router . RunOnNavigateWithRefreshAsync ( "jan" , false ) ;
192
- _ = _router . RunOnNavigateWithRefreshAsync ( "feb" , false ) ;
141
+ _ = _router . RunOnNavigateAsync ( "jan" , false ) ;
142
+ _ = _router . RunOnNavigateAsync ( "feb" , false ) ;
193
143
194
144
// Assert
195
145
var expected = "jan" ;
@@ -200,7 +150,7 @@ async Task OnNavigateAsync(NavigationContext args)
200
150
public async Task RefreshesOnceOnCancelledOnNavigateAsync ( )
201
151
{
202
152
// Arrange
203
- async Task OnNavigateAsync ( NavigationContext args )
153
+ Action < NavigationContext > OnNavigateAsync = async ( NavigationContext args ) =>
204
154
{
205
155
if ( args . Path . EndsWith ( "jan" ) )
206
156
{
@@ -217,11 +167,11 @@ async Task OnNavigateAsync(NavigationContext args)
217
167
}
218
168
Assert . True ( false , "OnUpdateDisplay called more than once." ) ;
219
169
} ;
220
- _router . OnNavigateAsync = OnNavigateAsync ;
170
+ _router . OnNavigateAsync = new EventCallback < NavigationContext > ( null , OnNavigateAsync ) ;
221
171
222
172
// Act
223
- var jan = _renderer . Dispatcher . InvokeAsync ( ( ) => _router . RunOnNavigateWithRefreshAsync ( "http://example.com/jan" , false ) ) ;
224
- var feb = _renderer . Dispatcher . InvokeAsync ( ( ) => _router . RunOnNavigateWithRefreshAsync ( "http://example.com/feb" , false ) ) ;
173
+ var jan = _renderer . Dispatcher . InvokeAsync ( ( ) => _router . RunOnNavigateAsync ( "http://example.com/jan" , false ) ) ;
174
+ var feb = _renderer . Dispatcher . InvokeAsync ( ( ) => _router . RunOnNavigateAsync ( "http://example.com/feb" , false ) ) ;
225
175
226
176
await jan ;
227
177
await feb ;
0 commit comments