2016-02-16 3 views
4

Недавно мы обновили все наше решение 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 всем, кто может помочь понять это.

+0

Я ничего не знаю о nmock, но я бы попробовал '.Will (Return.Value (Task.FromResult (quote)));' (т.е. обернуть возвращаемые значения async в Task.FromResult) –

+1

Это решение , Тест проходит сейчас. –

ответ

0

В рамках тестируемого метода методы, которые вы вызываете на макет, ожидают возврата Task туда, где ваш макет возвращает конкретный объект.

У меня нет опыта работы с NMock, но я знаю, что другие издевательские библиотеки терпят неудачу, когда тип возвращаемого объекта не совпадает с типом вызываемого метода.

Чтобы решить эту проблему вы можете использовать статический метод Task.FromResult так:

[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(Task.FromResult(quote))); 
    Expect.Once.On(_data).Method("RetrieveAllMilestonesForQuoteAsync").With(Is.EqualTo(quoteid)).Will(Return.Value(Task.FromResult(msList))); 
    Expect.Once.On(_data).Method("RetrieveAssignmentsForQuoteAsync").With(Is.EqualTo(quoteid)).Will(Return.Value(Task.FromResult(assignmentList))); 

    var biz = new QuotesBiz(_data, _empData, _logger, _mailer); 
    Assert.IsNotNull(biz); 
    var results = await biz.RetrieveQuoteAsync(quoteid); 
    Assert.That(results != null); 

} 

В будущем вы можете увидеть такие вопросы, как это отладка теста инспектирующий, что ваши издевается возвращается, в этом случае вы см. нуль.

Смежные вопросы