Da ich meine WCF-Methoden in Async konvertiert haben, sind meine Komponententests fehlgeschlagen, und ich kann nicht die richtige Syntax herausfinden, um sie zum Laufen zu bringen.Moq mit Task warten
Cllient Proxy-Klasse
public interface IClientProxy
{
Task DoSomething(CredentialDataList credentialData, string store);
}
Serviceklasse
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);
}
}
Testklasse
/// </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();
}
Die erro r ist, wenn ClientProxy.DoSomething
genannt:
Objektverweis nicht auf eine Instanz eines Objekts festgelegt
Die Parameter sowohl fein sind.
Wenn ich konvertieren meine ClientProxy.DoSomething
Methode auf eine synchrone Methode (public void DoSomething(...)
) der Code funktioniert gut, aber ich dies tun müssen asynchron
Es ist in diesem Fall sollte beachtet werden, falsch ist nur ein Platzhalter, wird der Wert falsch von dem Schein ignoriert tatsächlich, es braucht nur eine Aufgabe, jede Aufgabe , fertigstellen. Es könnte genauso gut "foo" statt falsch sein ... – mcse3010
@ mcse3010 in der Tat. – i3arnon
Upvoted für die 4.6-Syntax, sehr kurz und bezeichnend für das, was es tatsächlich ist. – starmandeluxe