Je viens de commencer à utiliser Rhino Mocks qui testent mes méthodes asynchrones dans le code. Mais alors que normalement le code fonctionne tout simplement parfait, mais tout en se moquant des tests avec Rhino Mocks, il y a quelques problèmes étranges async
.test de tâche asynchrone
Disons que je veux tester le code suivant qui appelle plusieurs numberGenerators
que tout se déroulera en même temps et attendre jusqu'à ce qu'ils soient tous fait:
public async Task MyTask()
{
List<Task<List<int>>> numberTasks = new List<Task<List<int>>>();
foreach (var numberGenerator in numberGenerators)
{
// GetNumbers is an 'async Task<List<int>>'
// As you can see I don't use 'await' so it should just add it and go on.
numberTasks.Add(numberGenerator.GetNumbers());
}
try
{
await Task.WhenAll(numberTasks);
}
catch (Exception e)
{
// Log exception if something happens at 'GetNumbers' (like time-out or whatever)
}
var numbers = new List<int>();
numbers.AddRange(numberTasks.Where(task => task.Status == TaskStatus.RanToCompletion).SelectMany(task => task.Result));
// Do something with the numbers
}
est testée avec:
numberGenerator.Expect(x => x.GetNumbers())
.WhenCalled(x => Thread.Sleep(10000))
.Return(Task.FromResult(numbers));
J'utilise deux des générateurs sur 'mocked' dans le code ci-dessus. Maintenant, si je cours le code avec des objets 'non-mocked' numberTasks.Add
ajoute juste la tâche et continue. Mais quand je me moque du WhenCalled sleep
, il attend 10 secondes avant de passer au suivant dans la boucle foreach.
Comment puis-je modifier mon simulacre pour qu'il se comporte comme un async Task
normal qui prend 10 secondes pour terminer?
Question supplémentaire: Je veux pouvoir faire la même chose avec .Throw()
, donc je peux attendre 10 secondes avant de lancer une exception.
Mise à jour: Bien que je pensais que ce qui suit fixerait le problème:
numberGenerator.Expect(x => x.GetNumbers())
.Return(Task.Delay(10000).ContinueWith(x => numbers));
Cela ne semble pas être le cas. Le Task.Delay commence à décompter au moment où ce mock
est créé. Donc, si je crée ce simulacre, attendez 10 secondes, puis exécutez le test, il sera fait dans 0 secondes.
Donc ma question demeure, comment puis-je tester une méthode asynchrone avec un delay
avant de renvoyer le résultat.
S'il vous plaît voir [ « des questions DEVRAIENT inclure des « tags » dans leurs titres? »] (Http: //meta.stackexchange .com/questions/19190/should-questions-include-tags-in-its-titles), où le consensus est "non, ils ne devraient pas"! –
En fait, le sujet original était correct, http://meta.stackexchange.com/help/tagging "La seule fois où vous devriez utiliser des balises dans votre titre, c'est quand elles sont organiques au ton de la conversation du titre." – Tseng
@Tseng en fait, même avec des tags, le titre original n'était pas correct - en aucun cas ... C'était juste une caténation de certains termes, et il manquait une question/un titre clair. S'il vous plaît voir: http://stackoverflow.com/help/how-to-ask. * Faites comme si vous parliez à un collègue occupé et que vous deviez résumer toute votre question en une phrase * –