我最近一直在做单元测试,我已经成功地使用 MOQ 框架和 MS 测试模拟了各种场景。我知道我们无法测试私有(private)方法,但我想知道我们是否可以使用 MOQ 模拟静态方法。
最佳答案
Moq(和其他基于 DynamicProxy 的模拟框架)无法模拟任何不是虚拟或抽象方法的东西。
密封/静态类/方法只能使用基于 Profiler API 的工具伪造,例如 Typemock (商业)或 Microsoft Moles(免费,在 Visual Studio 2012 Ultimate/2013/2015 中称为 Fakes)。
或者,您可以重构您的设计以抽象调用静态方法,并通过依赖注入(inject)为您的类提供这种抽象。这样您不仅会拥有更好的设计,而且可以使用免费工具(如 Moq)对其进行测试。
可以在不使用任何工具的情况下应用允许可测试性的通用模式。考虑以下方法:
public class MyClass
{
public string[] GetMyData(string fileName)
{
string[] data = FileUtil.ReadDataFromFile(fileName);
return data;
}
}
与其尝试模拟 FileUtil.ReadDataFromFile
,不如将其包装在 protected virtual
方法中,如下所示:
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
方法以返回您自己的测试数据。
希望对您有所帮助。
关于c# - 如何使用 MOQ 框架在 c# 中模拟静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12580015/