Moq:返回模拟对象,创建了大多数实现

时间:2011-06-07 06:00:45

标签: moq

我想以这样的方式模拟我的Repository对象,它仍然可以进行实际的数据库检索操作。仅对于保存操作,我想设置返回模拟数据,因为我不希望它保存到数据库中。

我该怎么做?

感谢。

2 个答案:

答案 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>()));
     }
 }

在这种情况下,SetupReturns的链式调用将保证调用方法(即VerifyAndSave)将看到您指定的值 - 在这种情况下为“SAVED”

有关更多示例,请查看Moq quickstart文档。