[英]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.