Проверьте, было ли задано свойство - с помощью Moq

Я новичок в Moq и тестирую вообще, так вот мой noobish Q. Как проверить, установлено ли свойство Статус в Запросе с помощью Moq?

public class DudeManager
{
        private readonly IDRepository _repo;

        public DManager(IDRepository repo)
        {
            _repo = repo;
        }

        public void Create(Request r)
        {
            r.Status = Status.Submitted;
            _repo.AddRequest(r);
        }
}

Есть ли лучший подход, чем следующий? Возможно, используя VerifySet?

        [TestMethod]
        public void AddingNewRequestSetsStatusToSubmitted()
        {
            //Arrange
            var mock = new Mock<IDRepository>();
            var mockRequest = new Mock<Request>();
            var dManager = new DManager(mock.Object);

            //Act
            dManager.Create(mockRequest.Object);

            //Assert
            Assert.AreEqual(Status.Submitted, mockRequest.Object.Status);
        }

РЕДАКТИРОВАТЬ:. Это тот подход, который я использовал после всех полезных советов:

//Arrange
var request = new Request();
var mock = new Mock<IDRepository>();
var dManager = new DManager(mock.Object);
mock.Setup(x => x.AddRequest(It.IsAny<Request>()));

//Act
dManager.QueueNewRequest(request);

//Assert
Assert.AreEqual(RequestStatus.Submitted, request.Status);

Этот подход мне кажется правильным. Кто-нибудь думает иначе?

Ответы

Ответ 1

Я думаю, что VerifySet - правильный подход. Он будет выглядеть примерно так:

//Arrange
var mock = new Mock<IDRepository>();
var mockRequest = new Mock<Request>();
// TODO: set some expectations here

var dManager = new DManager(mock.Object);

//Act
dManager.Create(mockRequest.Object);

//Assert
mockRequest.VerifySet(x => x.Status = Status.Submitted);

Я верю в ваше дело, он взрывается, потому что вы не настроили свой макет запроса на обработку заданной операции в статусе.

Один простой способ сделать это - использовать SetupAllProperties, например:

//Arrange
var mock = new Mock<IDRepository>();
var mockRequest = new Mock<Request>();
mockRequest.SetupAllProperties();

Ответ 2

Я думаю, что вы должны использовать строгое поведение по умолчанию, тогда вы можете сделать проверку одним вызовом. Это также заставляет вас писать свой тест более явно.

[TestMethod]
public void AddingNewRequestSetsStatusToSubmitted()
{
    //Arrange
    var mock = new Mock<IDRepository>(MockBehavior.Strict);
    var mockRequest = new Mock<Request>(MockBehavior.Strict);
    var dManager = new DManager(mock.Object);

    mockRequest.SetupSet(item => item.Status = It.IsAny<StatusType>())
               .Verifiable();

    //Act
    dManager.Create(mockRequest.Object);

    //Assert
    Assert.AreEqual(mockRequest.Object.Status, Status.Submitted);
    mock.VerifyAll();
    mockRequest.VerifyAll();
}

Ответ 3

mock.Verify(m=>m.AddRequest(It.Is<Request>(r=>r.Status == expectedStatus)));

Вы можете проверить, что метод AddRequest вызывается с параметром (Request), который имеет правильный Status. Кроме того, насмешка над объектом Request здесь не нужна.