簡體   English   中英

最小起訂量-模擬.Object.MyMethod模擬不起作用

[英]Moq - mock.Object.MyMethod mocking does not work

我有一個奇怪的麻煩。 我對Moq不太熟悉,更是一名GUI用戶。 我試圖在代碼中模擬工廠方法。 工廠看起來像這樣,並返回一個執行許多IO操作的ISettings實例。 我希望它只返回一個內存ISettings實例以加快測試速度。

public class SettingsFactory
{
    internal ISettings mSettingsImpl;
    internal virtual ISettings CreateOrGetSettings()
    {
        return mSettingsImpl ?? (mSettingsImpl = new XmlSettings());
    }
}

而模擬是

var imocked = new Mock<SettingsFactory>() {CallBase = false};
imocked.Setup(x => x.CreateOrGetSettings()).Returns(new NonPersistingSettings());
var tryToSeeTheType = imocked.Object.CreateOrGetSettings();

tryToSeeTheType是XMLSettings,而不是我所期望的NonPersistingSettings。 單步執行結果到代碼中,向我展示了它直接進入原始工廠方法。 有什么建議我在這里做錯了嗎?

模擬對象的“ Object”屬性實際上不是您要模擬的類的實例。

模擬的目的是能夠替換您要測試的方法所依賴的對象。

想象一下,您的SettingsFactory執行非常昂貴的操作,例如訪問網絡,數據庫或文件系統。 您不希望測試訪問那些昂貴的資源,所以您創建了一個模擬。 我會是這樣的:

public class ClassThatUsesSettingsFactory
{
    private readonly SettingsFactory _settingsFactory;

    public ClassThatUsesSettingsFactory(SettingsFactory settingsFactory)
    {
       _settingsFactory = settingsFactory;
    }

    public void MethodThatCallsSettingsFactory()
    {
       //... do something
       var settings = _settingsFactory.CreateOrGetSettings();
       //... do something
    }
}

這樣,您就可以用單元測試中的模擬代替SettingsFactory,如下所示:

[TestMethod]
public void MakeSureSettingsFactoryIsCalled()
{
   var settingsFactoryMock = new Mock<SettingsFactory>();

   settingsFactoryMock.Setup(f => f.CreateOrGetSettings(), Times.Once).Verifiable();

   var subjectUnderTest = new ClassThatUsesSettingsFactory(settingsFactoryMock.Object);

   subjectUnderTest.MethodThatCallsSettingsFactory();

   settingsFactoryMock.Verify();
}

基本上,此單元測試僅確保方法CreateOrGetSettings被調用一次,並且僅在執行MethodThatCallsSettingsFactory時調用一次。

Moq所做的是用其虛擬方法的不同實現創建一個不同的類,該類很可能會在調用后將標志設置為true,然后在“ Verify”方法上檢查該標志的值。

這里有很多要把握的地方,所以我希望它很清楚,因為您提到您對Moq的經驗不足。

暫無
暫無

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

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