модульный тест с фиктивными объектами - PullRequest
0 голосов
/ 13 февраля 2010

Пожалуйста, ознакомьтесь со следующей статьей о тестировании с макетами

Итак, есть пример модульного теста с фиктивными объектами. Как видите, тест написан для метода GetPersonByID. В интерфейсе IPersonServices есть еще один метод: List<Person> GetPersons();

Может кто-нибудь сказать мне, как метод Test в этом сервисе должен выглядеть с использованием фиктивных объектов? например, в случае GetPersons, который имеет тип List.

Ответы [ 2 ]

5 голосов
/ 13 февраля 2010

Было бы лучше найти другой пример модульного тестирования с Rhino.Mocks. В приведенном здесь примере проверяется фактический тестируемый класс, чего вы никогда не сделаете.

Предположим, у вас есть PersonRepository и PersonService. Вы хотите выполнить модульное тестирование PersonService, который использует PersonRepository. Реализация Person опущена.

 public interface IPersonService
 {
      Person GetPerson( int id );
      List<Person> GetPersons();
 }

 public class PersonRepository
 {
      public virtual GetPerson( int id )
      {
          ... implementation
      }

      public virtual GetPersons()
      {
          ... implementation
      }
 }


 public class PersonService : IPersonService
 {
     private PersonRepository Repository { get; set; }

     public PersonService() : this(null) { }

     public PersonService( PersonRepository repository )
     {
         this.Repository = repository ?? new PersonRepository();
     }

     public Person GetPerson( int id )
     {
         return this.Repository.GetPerson( id );
     }

     public List<Person> GetPersons()
     {
         return this.Repository.GetPersons();
     }
}

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

public void GetPersonTest()
{
     var repository = MockRepository.GenerateMock<PersonRepository>();

     var expectedPerson = new Person( 1, "Name" );

     repository.Expect( r => r.GetPerson( 1 ) ).Return( expectedPerson );

     var service = new PersonService( repository );

     var actualPerson = service.GetPerson( 1 );

     Assert.AreEqual( expectedPerson.ID, actualPerson.ID );
     Assert.AreEqual( expectedPerson.Name, actualPerson.Name );

     repository.VerifyAllExpectations();
}

public void GetPersonsTest()
{
     var repository = MockRepository.GenerateMock<PersonRepository>();

     var expectedPerson = new Person( 1, "Name" );

     var listOfPeople = new List<Person> { expectedPerson };

     repository.Expect( r => r.GetPersons() ).Return( listOfPeople );

     var service = new PersonService( repository );

     var actualList = service.GetPersons( );

     Assert.AreEqual( 1, actualList.Count );

     var actualPerson = actualList.First();

     Assert.AreEqual( expectedPerson.ID, actualPerson.ID );
     Assert.AreEqual( expectedPerson.Name, actualPerson.Name );

     repository.VerifyAllExpectations();
}
0 голосов
/ 14 февраля 2010

Как сказал tvanfosson , это не очень полезный пример.

Вот пример из Rhino Mocks wiki .

        [Test]
        public void SaveProjectAs_CanBeCanceled()
        {
            MockRepository mocks = new MockRepository();
            // projectView is the mock object
            IProjectView projectView = mocks.StrictMock<IProjectView>();
            Project prj = new Project("Example Project");
            // presenter is the object under test
            IProjectPresenter presenter = new ProjectPresenter(prj, projectView);

            // set expectations on the mock object
            Expect.Call(projectView.Title).Return(prj.Name);
            Expect.Call(projectView.Ask(question, answer)).Return(null);
            mocks.ReplayAll();

            // now execute the test
            Assert.IsFalse(presenter.SaveProjectAs());
            mocks.VerifyAll();
        }

Я не думаю, что есть что-то особенное в возврате типа List из вызова смоделированного метода. Просто настройте ожидание как обычно. В приведенном выше примере, если метод Ask() вернул список строк, метод Return() после Expect.Call(...Ask...) будет принимать список строк. Это прекрасная вещь в сочетании макетов записи / воспроизведения и обобщений, ваши ожидания имеют встроенную безопасность типов. Гораздо приятнее, чем в более ранних библиотеках фиктивных объектов, где вы определяли все с помощью метода names в строках, и все возвращаемые значения просто объекты.

Для более подробного объяснения этого примера, наряду со многими другими, ознакомьтесь с Rhino Mocks wiki .

...