Недавно мы обновили все наше решение Framework Framework 4.5.2 и используем async/wait. Я уже написал несколько тестов для уровня служб данных и части уровня бизнес-сервисов, но теперь у меня есть новый тест, который терпит неудачу с NUnits «не все ожидаемые вызовы выполнялись». Мы используем NUnit V3.0.1 и NMock 2.0.0.Тестирование модуля с использованием методов async/wait с использованием NUnit
Это метод под тест:
public async Task<objQuote> RetrieveQuoteAsync(int quoteid)
{
var q = await _data.RetrieveQuoteAsync(quoteid);
if (q != null)
{
q.Milestones = await _data.RetrieveAllMilestonesForQuoteAsync(quoteid);
q.Assignments = await _data.RetrieveAssignmentsForQuoteAsync(quoteid);
}
return q;
}
И это определение класса данных осмеиваемым (_data в коде выше):
public interface IQuotesData
{
string ConnectionString { get; set; }
Task<int> SaveQuoteAsync(objQuote quote);
Task<objQuote> RetrieveQuoteAsync(int quoteid);
//objQuote RetrieveQuoteWithoutAssignments(int quoteid);
Task<List<objQuote>> RetrieveAllQuotesAsync();
Task<List<objQuote>> RetrieveAllQuotesForFYAsync(int fy);
Task<int> SaveQuoteActivityAsync(objQuoteActivity qa);
Task DeleteQuoteAsync(int quoteid);
Task<int> SaveQuoteMilestoneAsync(objQuoteMilestone ms);
Task<List<objQuoteMilestone>> RetrieveAllMilestonesForQuoteAsync(int quoteid);
Task<List<objQuoteActivity>> RetrieveAllQuoteActivitiesAsync(int quoteid);
Task<int> SaveAssignmentAsync(objAssignment ass);
Task<int> SaveAssignmentOverheadAsync(objFAOverHead oh);
Task<List<objFAOverHead>> RetrieveAllOverheadsForAssignment(int assignmentid);
Task<objAssignment> RetrieveAssignmentAsync(int assid);
Task<List<objAssignment>> RetrieveAssignmentsForQuoteAsync(int quoteid);
Task<int> SaveDelegationAsync(objDelegation del);
Task<int> SaveDelegationOverheadAsync(objFAOverHead oh);
Task<List<objFAOverHead>> RetrieveAllOverheadsForDelegation(int delegationid);
Task<List<objDelegation>> RetrieveDelegationsforAssignment(int assid);
Task<int> SaveCommentAsync(objQuoteComment comment);
Task<List<objQuoteComment>> RetrieveAllCommentsForQuoteAsync(int quoteid);
}
И это мой тест:
[Test]
public async void Can_Retrieve_Quote()
{
const int quoteid = 42;
var quote = new objQuote() { ID = 42};
var msList = new List<objQuoteMilestone>();
var assignmentList = new List<objAssignment>();
Expect.Once.On(_data).Method("RetrieveQuoteAsync").With(Is.EqualTo(quoteid)).Will(Return.Value(quote));
Expect.Once.On(_data).Method("RetrieveAllMilestonesForQuoteAsync").With(Is.EqualTo(quoteid)).Will(Return.Value(msList));
Expect.Once.On(_data).Method("RetrieveAssignmentsForQuoteAsync").With(Is.EqualTo(quoteid)).Will(Return.Value(assignmentList));
var biz = new QuotesBiz(_data, _empData, _logger, _mailer);
Assert.IsNotNull(biz);
var results = await biz.RetrieveQuoteAsync(quoteid);
Assert.That(results != null);
}
На данный момент я не уверен, что это проблема с кодированием или проблема с тестированием. Похоже, что два вызова внутри оператора if if проверяемого кода не выполняются.
TIA всем, кто может помочь понять это.
Я ничего не знаю о nmock, но я бы попробовал '.Will (Return.Value (Task.FromResult (quote)));' (т.е. обернуть возвращаемые значения async в Task.FromResult) –
Это решение , Тест проходит сейчас. –