2017-04-21 4 views
1

Je suis en train de se moquer d'une méthode de dbWriteService qui renvoie une exception globale quand je l'appelle, même si tout n'est pas nulle. Je suis vraiment nouveau à moquer et rhinocéros, donc je n'ai pas vraiment le problème.Rhino Mock appeler une méthode async Tâche

Ceci est la partie que je veux railler dans la fonction que je veux tester:

public async Task<bool> SaveDataAsync(object data) { 
... 
    await _dbWriteService.UpdateAsync(data); 
... 
} 

Je raille le writeService comme ceci:

dbWriteService = MockRepository.GenerateStub<IDbWriteService>(); 
dbWriteService.Expect(service => service.UpdateAsync(null)); 
var wasSaved = subject.SaveDataAsync(data).Result; 
dbWriteService.AssertWasCalled(service => service.UpdateAsync(null)); 

et je reçois une exception comme celui-ci :

System.AggregateException: One or more errors occurred. ---> System.NullReferenceException: Object reference not set to an instance of an object. 
    at ClearingDataRepository.<SaveDataAsync>d__28.MoveNext() in ....\ClearingDataRepository.cs:line 170 
--- End of inner exception stack trace --- 
    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) 
    at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) 
    at System.Threading.Tasks.Task`1.get_Result() 
    at UnitTests.Services.ClearingDataRepositoryTests.SaveDataAsync_Sucess() in ....\ClearingDataRepositoryTests.cs:line 90 

J'ai essayé quelques petites choses avec la fonction simulée, mais je ne comprends pas pourquoi Ce truc ne marche pas. Quelqu'un pourrait-il m'expliquer cela?

Répondre

2

Tout d'abord, vous devez remplacer GenerateStub par GenerateMock afin de pouvoir utiliser des fonctionnalités fictives. En second lieu, il serait préférable d'utiliser await au lieu de .Result() dans votre test, et la méthode d'essai type de retour peut être async Task. Troisièmement, semble comme Rhino Mock veut que vous définissez la valeur de retour pour une maquette, ce qui pourrait être mis à Task.FromResult(0).

Par exemple, pour vous assurer UpdateAsync a été appelé avec null valeur et résultat final était true vous pourriez écrire la suite test avec MSTest.

[TestMethod] 
    public async Task TestMethod1() 
    { 
     // Arrange 
     var dbWriteService = MockRepository.GenerateMock<IDbWriteService>(); 
     dbWriteService.Expect(service => service.UpdateAsync(null)).Return(Task.FromResult(0)); 
     var subject = new Class1(dbWriteService); 

     // Act 
     var result = await subject.SaveDataAsync(null); 

     // Assert 
     Assert.IsTrue(result); 
     dbWriteService.AssertWasCalled(service => service.UpdateAsync(null)); 
    } 

Class1 est la classe avec la méthode SaveDataAsync dans mon cas.