我想以这样的方式模拟我的Repository对象,它仍然可以进行实际的数据库检索操作。仅对于保存操作,我想设置返回模拟数据,因为我不希望它保存到数据库中。
我该怎么做?
感谢。
答案 0 :(得分:0)
也许您应该将Save操作设置为虚拟并在您在测试中使用的子类中覆盖它而不是使用Moq?
答案 1 :(得分:0)
首先,您的单元测试实际上不应该直接进入数据库(它可以用于集成测试,但这是一个更大的主题)。不过,你想要做的事情对于Moq来说非常简单:
public class MyRepo
{
public virtual string Save(MyClass foo)
{
// perform save...
}
}
public class MyService
{
public MyRepo Repo { get; set; }
public string VerifyAndSave(MyClass foo)
{
// verify foo...
return new Repo.Save(foo);
}
}
public class MyClass()
{
public string SomeData { get; set; }
}
注意方法上的virtual
修饰符 - 这些对于Moq能够存根它们非常重要。
在您的测试中,您可以执行以下操作:
[TestClass]
public class SomeTests
{
private Mock<MyRepo> MockRepo { get; set; }
private MyService Target { get; set; }
[TestInitialize]
public void Setup()
{
MockRepo = new Mock<MyRepo>();
Target = new MyService();
Target.Repo = MockRepo.Object;
}
[TestMethod]
public void MyTest()
{
const string expectedOutput = "SAVED";
MyClass exampleData = new MyClass();
MockRepo.Setup(x => x.Save(It.IsAny<MyClass>())).Returns(expectedOutput);
Target.VerifyAndSave(exampleData);
MockRepo.Verify(x => x.Save(It.IsAny<MyClass>()));
}
}
在这种情况下,Setup
和Returns
的链式调用将保证调用方法(即VerifyAndSave
)将看到您指定的值 - 在这种情况下为“SAVED”
有关更多示例,请查看Moq quickstart文档。