Несколько проблем, одна из которых вы не ожидаете асинхронного вызова:
public async Task<string> WriteNameToDataBase()
{
var employeeName = await GetName();
return $"Wrote {employeeName} to database";
}
две ваши насмешки неверного результата, moq поддерживает async:
mockObject.Setup(x => x.GetName()).ReturnsAsync("Frank");
Но большая проблемаздесь вы издеваетесь над всем объектом.Это ничего не проверяет.Вы, вероятно, хотите что-то более похожее на:
public class Employee : IEmployee
{
private readonly INameRepo _repo;
public Employee(INameRepo repo)
{
//this is dependancy injection
_repo = repo;
}
public async Task<string> WriteNameToDataBase()
{
var employeeName = await _repo.GetName();
return $"Wrote {employeeName.Result} to database";
}
}
Ваше хранилище теперь представляет собой отдельную вещь, представленную этим интерфейсом
public interface INameRepo
{
Task<string> GetName();
}
Тогда ваш тест будет выглядеть так:
[Test]
//note this is also async now
public async Task WriteToDBShouldWrite()
{
//mock the dependencies
var mockObject = new Mock<INameRepo>();
mockObject.Setup(x => x.GetName()).ReturnsAsync("Frank");
//test the actual object
Employee emp = new Employee(mockObject.Object);
string result = await emp.WriteToDBShouldWrite();
Assert.AreEqual("Wrote Frank to database", result);
}
Если вы просто хотите убедиться, что вызывается GetName
, вы должны использовать Verify
вместо возврата произвольного значения:
[Test]
//note this is also async now
public async Task WriteToDBShouldWrite()
{
var mockObject = new Mock<INameRepo>();
mockObject.Setup(x => x.GetName()).ReturnsAsync("Frank");
string result = mockObject.Object.WriteNameToDataBase();
Employee emp = new Employee(mockObject.Object);
await emp.WriteToDBShouldWrite();
//ensure GetName is called once and once only
mockObject.Verify(v => v.GetName(), TimesOnce);
}