Проверьте, было ли задано свойство - с помощью 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
здесь не нужна.