簡體   English   中英

有沒有辦法按值復制Moq Mock <>?

[英]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是純粹的行為; 它沒有數據。

您可以考慮的幾個替代方案如下:

  • 用一個抽象的DataSetBase類替換IDataSet,並像你想要它一樣實現Copy方法(也就是說, 不是一個抽象或虛方法)。
  • 而不是創建IDataSet模擬,使用假。 假冒是一種特定於測試的實現接口,其行為接近真實的行為。 沒有用於創建Fakes的框架/庫,因此您需要手動編寫這樣的假冒代碼。
  • 考慮Copy方法是否真的應該是接口的一部分。 聽起來對我來說這是一個實體細節,它首先不屬於界面。

您可以在優秀的書籍xUnit Test Patterns中閱讀Stubs,Mocks,Fakes和其他單元測試設計模式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM