Как выполнить модульное тестирование свойств переменной, объявленной в тестируемом методе - PullRequest
4 голосов
/ 23 сентября 2011

У меня есть метод сервисного уровня, который получает объект (Dto) в качестве параметра.

В рамках этого метода я создаю новый бизнес-объект и передаю значения свойств Dto в свойства бизнес-объекта. Затем я передаю бизнес-объект в качестве параметра в вызов метода репозитория.

Как мой модульный тест будет гарантировать, что бизнес-объект, объявленный в тестируемом методе службы, получает правильное значение в своих свойствах?

Ответы [ 2 ]

3 голосов
/ 23 сентября 2011

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

РЕДАКТИРОВАТЬ: пример


Инфраструктура:

public interface IRepository
{
   void Add(BusinessObject item);
}

public sealed class ServiceLayerContext
{
   private readonly IRepository repository;

   public ServiceLayerContext(IRepository repository)
   {
       this.repository = repository;
   }

   public void ProcessDto(IDtoObject dto)
   {
       var businessObject = this.CreateBusinessObject(dto);
       this.repository.Add(businessObject);
   }

   private BusinessObject CreateBusinessObject(IDtoObject dto)
   {
   }
}

Проверка псевдокода (потому что RhinoMockі не Moq):

   [Test]
   public void ShouldCreateBusinessOBjectWithPropertiesInitializedByDtoValues()
   {
      // ARRANGE
      // - create mock of the IRepository
      // - create dto
      // - setup expectations for the IRepository.Add() method
      //   to check whether all property values are the same like in dto   
      var repositoryMock = MockRepository.GenerateMock<IRepository>();
      var dto = new Dto() { ... };
      BusinessObject actualBusinessObject = null;
      repositoryMock.Expect(x => x.Add(null)).IgnoreArguments().WhenCalled(
        (mi) => 
        {
            actualBusinessObject = mi[0] as BusinessObject;            
        }).Repeat().Any();

      // ACT
      // - create service layer, pass in repository mock
      // - execute svc.ProcessDto(dto)     
      var serviceLayerContext = new ServiceLayerContext(repositoryMock);
      serviceLayerContext.ProcessDto(dto);

      // ASSERT
      // - check whether expectations are passed
      Assert.IsNotNull(actualBusinessObject);
      Assert.AreEqual(dto.Id, actualBusinessObject.Id);
      ...
   }
0 голосов
/ 26 сентября 2011

Большое спасибо за вашу помощь. В приведенном ниже примере кода используется moq и он написан на vb.net для других программистов vb.net, которые могли столкнуться с аналогичными проблемами.

Класс бетона

Public Class UserService
Implements IUserService

Private ReadOnly userRepository As IUserRepository

Public Sub New( _
   ByVal userRepository As IUserRepository)

    Me.userRepository = userRepository

End Sub

Public Sub Edit(userDto As Dtos.UserDto) Implements Core.Interfaces.Services.IUserService.Edit

    Try
        ValidateUserProperties(userDto)

        Dim user = CreateUserObject(userDto)

        userRepository.Edit(user)


    Catch ex As Exception
        Throw
    End Try

End Sub

Private Function CreateUserObject(userDto As Dtos.UserDto) As User Implements  Core.Interfaces.Services.IUserService.CreateUserObject
    Dim user = New User With {.Id = userDto.Id, _
              .UserName = userDto.UserName, _
              .UserPassword = userDto.UserPassword, _
              .Profile = New Profile With {.Id = userDto.ProfileId}}
    Return user
End Function
Sub ValidateUserProperties(userDto As Dtos.UserDto)



End Sub

Тестовый класс

<TestFixture()>
Public Class UserServiceTest

Private userRepository As Mock(Of IUserRepository)
Public serviceUnderTest As IUserService

<SetUp()>
Public Sub SetUp()

    userRepository = New Mock(Of IUserRepository)(MockBehavior.Strict)

    serviceUnderTest = New UserService(userRepository.Object)


End Sub

<Test()>
Public Sub Test_Edit()
    'Arrange
    Dim userDto As New UserDto With {.UserName = "gbrown", .UserPassword = "power", .Id = 98, .ProfileId = 1}

    Dim userObject As User = Nothing

    userRepository.Setup(Sub(x) x.Edit(It.IsAny(Of User))) _
    .Callback(Of User)(Sub(m) userObject = m)

    'Act

    serviceUnderTest.Edit(userDto)


    'Assert

    userRepository.Verify(Sub(x) x.Edit(It.IsAny(Of User)), Times.AtLeastOnce())

    Assert.NotNull(userObject)
    Assert.AreEqual(userDto.Id, userObject.Id)
    Assert.AreEqual(userDto.ProfileId, userObject.Profile.Id)
    Assert.AreEqual(userDto.UserName, userObject.UserName)
    Assert.AreEqual(userDto.UserPassword, userObject.UserPassword)
End Sub
End Class
...