2009-07-03 3 views
0

У меня есть метод CreateAccount (...), который я хочу для модульного тестирования. В основном он создает объект учетной записи и сохраняет его в БД, а затем возвращает вновь созданную учетную запись. Я издеваюсь над репозиторием и ожидаю вызова Insert (...). Но метод Insert ожидает объект Account.Правильное взаимодействие службы тестирования/взаимодействия с репозиторией

Этот тест проходит, но это не кажется правильным, потому что CreateAccount создает учетную запись, и я создаю учетную запись для ожидаемого вызова Mock'а (два отдельных экземпляра учетной записи). Каков был бы правильный способ протестировать этот метод? Или я неправильно создаю учетные записи, используя этот метод?

[Fact] 
    public void can_create_account() 
    { 
     const string email = "[email protected]"; 
     const string password = "password"; 
     var accounts = MockRepository.GenerateMock<IAccountRepository>(); 
     accounts.Expect(x => x.Insert(new Account())); 
     var service = new AccountService(accounts); 

     var account = service.CreateAccount(email, password, string.Empty, string.Empty, string.Empty); 

     accounts.VerifyAllExpectations(); 
     Assert.Equal(account.EmailAddress, email); 
    } 

А вот CreateAccount Метод:

public Account CreateAccount(string email, string password, string firstname, string lastname, string phone) 
    { 
     var account = new Account 
          { 
           EmailAddress = email, 
           Password = password, 
           FirstName = firstname, 
           LastName = lastname, 
           Phone = phone 
          }; 

     accounts.Insert(account); 
     return account; 
    } 

ответ

1
[Test] 
public void can_create_account() 
{ 
    const string email = "[email protected]"; 
    const string password = "password"; 

    Account newAcc = new Account(); 
    var accounts = MockRepository.GenerateMock<IAccountRepository>(); 

    var service = new AccountService(accounts); 
    var account = service.CreateAccount(email, password, string.Empty, 
             string.Empty, string.Empty); 

    accounts.AssertWasCalled(x => x.Insert(Arg<Account> 
          .Matches(y => y.EmailAddess == email 
             && y.Password == password)));     

    Assert.AreEqual(email, account.EmailAddress); 
    Assert.AreEqual(password, account.Password); 
} 

Так что вы тестируете здесь, по существу, метод фабрики (т.е. он создает новый экземпляр объекта и возвращает его) , Единственный способ проверить эти методы - проверить, что мы возвращаем объект со свойствами, которые мы ожидаем (последние два вызова Assert.Equal выше делают это). У вас есть дополнительный вызов репозитория в вашем методе; и поэтому нам нужен дополнительный вызов AssertWasCalled с сопоставлением свойств, как указано выше (чтобы убедиться, что правильный экземпляр объекта использовался в качестве параметра для этого вызова).

+1

Извините, я должен был опубликовать фактический метод, который я тестировал, duh. Я обновил OP. – mxmissile

+1

Я не вижу, как newAcc и учетная запись будут одинаковыми, поскольку создаются 2 отдельных экземпляра. Или AreSame() просто сравнивает тип? – mxmissile

+1

Правильно. AreSame сравнивает экземпляры объектов, поэтому мой первоначальный ответ выше неверен. С тех пор я добавил некоторые исправления (сверху) – jpoh

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