2012-11-07 3 views
2

Какова наилучшая практика передачи параметра объекта в методе тестирования? Что использовать в этом случае (Mocks, Столбики или создать экземпляр объекта и заполнить его)Что использовать параметр mock или параметр экземпляра в методе тестирования?

Например:

[Test] 
public void LoadContentsFor_ValidUser_ReturnsEmptyList() 
{ 
    var user = new User {Id = 1, FirstName = "Test"}; 
    var contents = this.contentPresentationService.LoadContentsFor(user); 
    Assert.IsTrue(contents.Count == 0); 
} 

Или с помощью издевается:

[Test] 
public void LoadContentsFor_ValidUser_ReturnsEmptyList() 
{ 
    var user = new Mock<User>(); 
    user.Setup(x => x.Id).Returns(1); 
    user.Setup(x => x.FirstName).Returns("Test"); 
    var contents = this.contentPresentationService.LoadContentsFor(user.Object); 
    Assert.IsTrue(contents.Count == 0); 
} 

ответ

1

Если это простой объект Я предлагаю либо , создавая его вручную, либо используя какой-либо строительный инструмент, например AutoFixture или NBuilder (оба библиотек предназначены для решения с точным вопросом вы спрашиваете о):

// AutoFixture example 
var fixture = new Fixture(); 
var user = fixture 
    .Build<User>() 
    .With(u => u.Id, 1) 
    .With(u => u.FirstName, "John") 
    .CreateAnynomous(); 

Кроме того, AutoFixture предлагает множество полезных функций, такие как

  • Автогенераторных данные для свойств
  • пропускающие нежелательные свойства
  • замена определенных свойств с automocks (дать AutoMoq взгляд)

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

1

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

Любой объект, который существует за пределами проверяемого кода и реализует доступ к данным, услуги, управление сеансом и т. Д., Должен иметь интерфейс, чтобы они не были тесно связаны. Наличие этих интерфейсов позволяет вам легко издеваться над этими областями, поэтому никаких реальных манипуляций с данными не произойдет.

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