2015-08-18 3 views
-1

Im, используя FakeItEasy для моделирования методов модульных тестов. Один метод (с использованием параметра REF - может быть, это важно) сохраняет данные в базе данных, поэтому он высмеивал как «ничего не делает», когда используется метод издевательства с параметром ref, assert MustHaveHappened failed

A.CallTo(() => mockedUserRepository.Save(ref mwbeUserData)).DoesNothing(); 

. Но в этой ситуации в прошлом утверждают, терпит неудачу

A.CallTo(() => mockedUserRepository.Save(ref mwbeUserData)).MustHaveHappened(Repeated.Exactly.Once); 

с ошибкой:

Assertion failed for the following call: 
    MobileWallet.Common.DAL.IMwbeUserRepository.Save(<NULL>) 
    Expected to find it exactly once but found it #0 times among the calls: 
    1: MobileWallet.Common.DAL.IMwbeUserRepository.Get(userName: \"AAA\") 
    2: MobileWallet.Common.DAL.IMwbeUserRepository.Save(user: MobileWallet.Common.Repository.MwbeUserData) 

Полный код теста

[TestMethod] 
public void AddUser_MwbeUserObjectReturned() 
{ 
    //Arrange 

    MwbeUserRegistrationIn userRegistrationIn = new MwbeUserRegistrationIn() 
    { 
     BirthDate = DateTime.Today, 
     Email = "[email protected]", 
     FirstName = "Adam", 
     SecondName = "Ada2", 
     UserName = "AAA" 
    }; 

    //mock mockedNotificationService and related: 
    INotificationService mockedNotificationService = A.Fake<INotificationService>(); 
    //TODO: create notofication service 

    //mock IMwbeUserRepository and related 
    IMwbeUserRepository mockedUserRepository = A.Fake<IMwbeUserRepository>(); 

    MwbeReturnData<MwbeUserData> mwbeReturnData = new MwbeReturnData<MwbeUserData>(MwbeResponseCodes.NotFound);   

    MwbeUserData mwbeUserData = mwbeReturnData.Data; 

    A.CallTo(() => mockedUserRepository.Get(userRegistrationIn.UserName)).Returns(mwbeReturnData); 
    A.CallTo(() => mockedUserRepository.Save(ref mwbeUserData)).DoesNothing(); 

    MwbeUserService userService = new MwbeUserService(mockedUserRepository, mockedNotificationService); 

    //Act 
    MwbeUser user = userService.AddUser(userRegistrationIn); 

    //Assert 
    Assert.IsNotNull(user);    
    Assert.AreEqual(userRegistrationIn.Email, user.Email); 
    Assert.AreEqual(userRegistrationIn.UserName, user.UserName); 
    Assert.AreEqual(userRegistrationIn.FirstName,user.FirstName); 
    Assert.AreEqual(userRegistrationIn.SecondName, user.SecondName); 
    Assert.AreEqual(userRegistrationIn.BirthDate, user.BirthDate); 

    A.CallTo(() => mockedUserRepository.Get(userRegistrationIn.UserName)).MustHaveHappened(Repeated.Exactly.Once); 
    A.CallTo(() => mockedUserRepository.Save(ref mwbeUserData)).MustHaveHappened(Repeated.Exactly.Once); 
} 

UPDATE 1:

Пожалуйста, обратите внимание, что для обоих вызовов на это метод Сохранить, значение mwbeUserData - то же самое

MwbeUserData mwbeUserData = mwbeReturnData.Data; 

Если это null (но это не так).

Возможно, проблема с синтаксисом для параметра REF? Я читал, что должен использоваться метод под названием AssignsOutAndRefParameters, но я точно не знаю, как его использовать.

Теперь я буду использовать параметр MATCHES, чтобы сделать его более общим.

+2

я считаю, что это произошло потому, что вы утверждаете против 'экземпляра mwbeUserData' ... Пожалуйста, добавьте код' метода AddUser' .. –

+0

пожалуйста добавьте 'реализацию AddUser' –

ответ

3

I believes that it's occurred because you assert against mwbeUserData instance

@Old Fox имеет право на это.

Вы спрашиваете FakeItEasy, если mockedUserRepository.Save(ref mwbeUserData) был вызван с вводом null (mwbeUserData должен быть пустым на момент совершения проверки). Он не видел ничего подобного, поскольку MwbeUserData, который был отправлен в mockedUserRepository.Save внутри AddUser, похоже, не был нулевым.

Если вы считаете, что тест должен был пройти, возможно, ослабление вашего ограничения поможет, как в FakeItEasy: mocked method is not returning expected result.

Также обратите внимание, что параметр ref не влияет на это поведение. такое же сопоставление ограничений произойдет для «простого» параметра. По умолчанию освобождены только out. См. Argument Constraints в документации FakeItEasy для получения дополнительной информации об этом и более подробно о том, как использовать пользовательские сопоставления аргументов.

+1

В Blair Conraid: Я понимаю вашу идею, потому что она был моим первым сообщением о FakeItEasy :) –

+0

Хороший ответ +1, это то, что я думал в первом взгляде, но затем я снова прочитал вопрос, и я увидел исключение, основанное на исключении, есть 4 варианта: 1. в 'AddUser 'OP инициализирует новый экземпляр, который он сохраняет (если у него есть ошибка, код должен вызывать Null Reference ...). 2. в 'AddUser' OP выполняет проверку null до того, как он сохранит объект. 3. Специальный поток в 'AddUser'. 4. Мне нужны новые очки :) Итак, нам нужна реализация AddUser для выяснения правильной причины. –

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

  • Нет связанных вопросов^_^