我开始为我们的项目建立单元测试。我们决定让Moq协助对存储库进行“模拟”,因为我们不想对实时数据库运行测试。
我显然错误地使用Moq,如何编写GetMessage测试?前两个似乎工作正常。
GetMessage测试的返回值始终为null,因此测试失败
private Mock<IMessageRepository> _mockRepository;
private IMessageBoardService _service;
[TestInitialize]
public void Initialize()
{
_mockRepository = new Mock<IMessageRepository>();
_service = new MessageBoardService(_mockRepository.Object);
}
[TestMethod]
public void CreateMessage()
{
var result = _service.CreateMessage("Test", "Description", 8000, 0);
Assert.IsNotNull(result);
}
[TestMethod]
public void CreateComment()
{
var Message = _service.CreateMessage("Test", "Description", 8000, 0);
var Result = _service.CreateComment("Test Comment", Message.MessageID, 0);
Assert.IsNotNull(Result);
}
[TestMethod]
public void GetMessage()
{
var Message = _service.CreateMessage("Test", "Description", 8000, 0);
_service.AddMessage(Message);
_service.Save();
var RetMessage = _service.GetMessage(Message.MessageID); //Always returns Null
Assert.IsNotNull(RetMessage);
}
编辑= == ===============================
以下情况如何?
[TestMethod]
public void GetMessage()
{
var tmpMessage = _service.CreateMessage("Test", "Description", 5, 0);
_mockRepository.Setup(r => r.GetMessage(It.IsAny<int>()))
.Returns(tmpMessage);
var RetMessage = _service.GetMessage(tmpMessage.MessageID);
Assert.IsNotNull(RetMessage);
}
答案 0 :(得分:2)
你需要为你设定一个期望。类似的东西:
[TestInitialize]
public void Initialize()
{
_mockRepository = new Mock<IMessageRepository>();
_mockRepository.Setup(r=> r.GetMessage())
.Returns(8000); // I assume 8000 is message Id in test
_service = new MessageBoardService(_mockRepository.Object);
}
我假设您的存储库有一个服务使用的GetMessage。这是服务使用的方法需要被模拟。
这将针对此模拟的所有用途完成。出于这个原因,我会在个别测试中设置它而不是初始化。我只是想突出你需要一个期望。
善,
丹
答案 1 :(得分:1)
最好设置Stub,以便验证是否将正确的消息ID传递给存储库的方法:
[TestMethod]
public void GetMessage()
{
var tmpMessage = _service.CreateMessage("Test", "Description", 5, 0);
_mockRepository.Setup(r => r.GetMessage(tmpMessage.MessageID))
.Returns(tmpMessage);
var RetMessage = _service.GetMessage(tmpMessage.MessageID);
Assert.AreEqual(tmpMessage, RetMessage);
}
请注意,我还修改了断言,以便验证您可能关心的内容:返回的值是否正确(而不仅仅是它是否为null)。