Moq à la Tâche attendent
Depuis que j'ai converti mon WCF méthodes Asynchrones, mon unité tests ont échoué, et je ne peux pas comprendre la syntaxe correcte pour les faire fonctionner.
Cllient classe proxy
public interface IClientProxy
{
Task DoSomething(CredentialDataList credentialData, string store);
}
classe de service
public class CredentialSync : ICredentialSync
{
private ICredentialRepository _repository;
private IClientProxy _client;
public CredentialSync()
{
this._repository = new CredentialRepository();
this._client = new ClientProxy();
}
public CredentialSync(ICredentialRepository repository, IClientProxy client)
{
this._repository = repository;
this._client = client;
}
public async Task Synchronise(string payrollNumber)
{
try
{
if (string.IsNullOrEmpty(payrollNumber))
{
.... some code
}
else
{
CredentialDataList credentialData = new CredentialDataList();
List<CredentialData> credentialList = new List<CredentialData>();
//fetch the record from the database
List<GetCredentialData_Result> data = this._repository.GetCredentialData(payrollNumber);
var pinData = this._repository.GetCredentialPinData(payrollNumber);
//get the stores for this employee
var storeList = data.Where(a => a.StoreNumber != null)
.GroupBy(a => a.StoreNumber)
.Select(x => new Store { StoreNumber = x.Key.ToString() }).ToArray();
var credential = this.ExtractCredentialData(data, pinData, payrollNumber);
credentialList.Add(credential);
credentialData.CredentialList = credentialList;
foreach (var store in storeList)
{
//this line causes an Object reference not set to an instance of an object error
await _client.DoSomething(credentialData, store.StoreNumber);
}
}
}
catch (Exception ex)
{
throw new FaultException<Exception>(ex);
}
}
De La Classe De Test
///</summary>
[TestClass]
public class SynchTest
{
private Mock<ICredentialRepository> _mockRepository;
private Mock<IClientProxy> _mockService;
[TestInitialize]
public void Setup()
{
... some setups for repository which work fine
}
[TestMethod]
public async Task SynchroniseData_WithOneEmployee_CallsReplicateService()
{
this._mockService = new Mock<IClientProxy>();
this._mockService.Setup(x=>x.DoSomething(It.IsAny<CredentialDataList>(), It.IsAny<string>()));
//arrange
string payrollNumber = "1";
CredentialSync service = new CredentialSync(this._mockRepository.Object, this._mockService.Object);
//act
await service.Synchronise(payrollNumber);
//assert
this._mockService.VerifyAll();
}
L'erreur, c'est quand ClientProxy.DoSomething
est appelé:
Objet de référence non définie à une instance d'un objet
Les paramètres sont à la fois fines.
Si je convertir mon ClientProxy.DoSomething
méthode à une méthode synchrone
(public void DoSomething(...)
)le code fonctionne très bien, mais je n'ai besoin de cela pour être appelée de façon asynchrone
Vous devez vous connecter pour publier un commentaire.
DoSomething
retournenull
au lieu de retourner unTask
, et de sorte que vous obtenez une exception lorsque l'attendent. Vous devez spécifier lors de la construction de la maquette qu'il doit retourner unTask
.Dans ce cas, il semble que vous pouvez simplement retourner un déjà terminé la tâche à l'aide de
Task.FromResult
donc la maquette de l'installation devrait ressembler à ceci:À commencer par la prochaine version de .Net (4.6), vous pouvez utiliser
Task.CompletedTask
comme ceci:Vous pouvez réduire la quantité de désordre dans le code en utilisant ReturnsAsync
this._mockService.Setup(...).ReturnsAsync(false)
;De cette façon, vous pouvez supprimer le
Task.FromResult
partie du codeJe pense que vous avez besoin de retourner la
Task
de laDoSomething
se moquer de.Returns(Task.Delay(0));