我有这个代码:
public static bool IsValidVoucher(string id)
{
//read tsv files
var temp1 = AppData.GetAppData("stringval");
// code that need to be tested
return true;
}
我喜欢创建单元测试,但我如何模拟 AppData.GetAppData("stringval")
到我想要的任何值,这样我就可以测试其余代码。
AppData 类是:
public class AppData
{
public static object GetAppData(string name)
{
//...
}
}
最佳答案
不能以简单的方式 模拟静态方法。您基本上有两个选择:
如果您拥有
AppData
类,请更改实现以实现接口(interface)(例如IAppData
)并删除static
修饰符在GetAppData
方法上进行模拟。public interface IAppData { object GetAppData(string id); } public class AppData : IAppData { public object GetAppData(string id) {} } public class Foo { private readonly IAppData _appData; public Foo(IAppData appData) { _appData = appData; } public bool IsValidVoucher(string id) { // Call through object instance instead for class reference var temp1 = _appData.GetAppData("stringval"); } }
如果您不拥有
AppData
类,请使用实现接口(interface)的包装类(例如AppDataWrapper
)并从IsValidVoucher 调用该方法
改为:public interface IAppData { object GetAppData(string id); } public class AppDataWrapper : IAppData { public object GetAppData(string id) { return AppData.GetAppData(id); } } public class Foo { private readonly IAppData _appData; public Foo(IAppData appData) { _appData = appData; } public bool IsValidVoucher(string id) { var temp1 = _appData.GetAppData("stringval"); } }
然后您可以使用 Moq 对 Foo
进行单元测试(此处以 xunit 为例):
public class FooTests
{
private readonly IAppData _mockAppData;
public FooTests()
{
var mockAppData = new Mock<IAppData>();
mockAppData.Setup(m => m.GetAppData(It.IsAny<string>)).Returns("my test value");
_mockAppData = mockAppData.Object;
}
[Fact]
public void IsValidVoucher_ValidAppData_Returns()
{
var foo = new Foo(_mockAppData);
// Unit test foo.IsValidVoucher
}
}
关于c# - 我怎样才能模拟这个静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31872005/