我在System.Data.DataSet前面使用接口(IDataSet)进行测试。我希望能够模拟Copy()方法。基本上我想要一个同一个模拟对象的副本/克隆。
这是我想要做的一些伪代码。
Mock<IDataSet> dataMock = new Mock<IDataSet>();
Mock<IDataSet> copyMock = ??? // How do I clone the mock?
dataMock.Setup(c => c.Copy()).Returns(copyMock.Object);
这可能吗?
答案 0 :(得分:4)
基本上,模拟不是真实的,所以它没有真实的行为。它不应该有真正的行为 - 它应该做任何你告诉它的事情,同时跟踪发生的事情。没有更多,也没有更少。
这意味着你必须告诉它它的Copy方法是如何工作的。如果您执行以下操作, 复制方法将具有的实施内容:
Mock<IDataSet> dataMock = new Mock<IDataSet>();
Mock<IDataSet> copyMock = new Mock<IDataSet>();
dataMock.Setup(c => c.Copy()).Returns(copyMock.Object);
但是,你也可以这样做:
Mock<IDataSet> dataMock = new Mock<IDataSet>();
Mock<IDataSet> copyMock = dataMock;
dataMock.Setup(c => c.Copy()).Returns(copyMock.Object);
然后,和 成为Copy方法的实现。请记住:接口不是合同,说明方法应该做什么;它只定义了方法的签名。
您可能希望将数据从一个IDataSet复制到另一个IDataSet,但请记住Mock是纯粹的行为;它没有数据。
您可以考虑以下几种方法:
您可以在优秀的书籍xUnit Test Patterns中阅读Stubs,Mocks,Fakes和其他单元测试设计模式。