問題描述
我最近一直在做單元測試,我已經使用 MOQ 框架和 MS Test 成功地模擬了各種場景.我知道我們無法測試私有方法,但我想知道我們是否可以使用 MOQ 模擬靜態方法.
I have been doing unit testing recently and I've successfully mocked various scenarios using MOQ framework and MS Test. I know we can't test private methods but I want to know if we can mock static methods using MOQ.
推薦答案
起訂量(和其他DynamicProxy-based 模擬框架)無法模擬任何不是虛擬或抽象方法的東西.
Moq (and other DynamicProxy-based mocking frameworks) are unable to mock anything that is not a virtual or abstract method.
只能使用基于 Profiler API 的工具來偽造密封/靜態類/方法,例如 Typemock(商業)或 Microsoft Moles(免費,在 Visual Studio 2012 Ultimate 中稱為 Fakes/2013/2015).
Sealed/static classes/methods can only be faked with Profiler API based tools, like Typemock (commercial) or Microsoft Moles (free, known as Fakes in Visual Studio 2012 Ultimate /2013 /2015).
或者,您可以重構您的設計以抽象調用靜態方法,并通過依賴注入將此抽象提供給您的類.那么您不僅會有更好的設計,而且還可以使用免費工具(例如 Moq)進行測試.
Alternatively, you could refactor your design to abstract calls to static methods, and provide this abstraction to your class via dependency injection. Then you'd not only have a better design, it will be testable with free tools, like Moq.
無需完全使用任何工具即可應用允許可測試性的通用模式.考慮以下方法:
A common pattern to allow testability can be applied without using any tools altogether. Consider the following method:
public class MyClass
{
public string[] GetMyData(string fileName)
{
string[] data = FileUtil.ReadDataFromFile(fileName);
return data;
}
}
您可以將其包裝在 protected virtual
方法中,而不是嘗試模擬 FileUtil.ReadDataFromFile
,如下所示:
Instead of trying to mock FileUtil.ReadDataFromFile
, you could wrap it in a protected virtual
method, like this:
public class MyClass
{
public string[] GetMyData(string fileName)
{
string[] data = GetDataFromFile(fileName);
return data;
}
protected virtual string[] GetDataFromFile(string fileName)
{
return FileUtil.ReadDataFromFile(fileName);
}
}
然后,在您的單元測試中,從 MyClass
派生并將其命名為 TestableMyClass
.然后你可以重寫 GetDataFromFile
方法來返回你自己的測試數據.
Then, in your unit test, derive from MyClass
and call it TestableMyClass
. Then you can override the GetDataFromFile
method to return your own test data.
希望對您有所幫助.
這篇關于如何使用 MOQ 框架在 c# 中模擬靜態方法?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!