[英]Is there a way to copy a Moq Mock<> by value?
我在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);
這可能嗎?
基本上,模擬不是真實的,所以它沒有真正的行為。 它不應該有真正的行為 - 它應該做任何你告訴它的事情,同時跟蹤發生的事情。 沒有更多,也沒有更少。
這意味着你必須告訴它它的Copy方法是如何工作的。 如果您執行以下操作, 那就是 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);
而這一點 ,那么,成為復制方法的實現。 請記住:接口不是合同,說明方法應該做什么; 它只定義了方法的簽名。
您可能希望將數據從一個IDataSet復制到另一個IDataSet,但請記住Mock是純粹的行為; 它沒有數據。
您可以考慮的幾個替代方案如下:
您可以在優秀的書籍xUnit Test Patterns中閱讀Stubs,Mocks,Fakes和其他單元測試設計模式 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.