c# - 我怎样才能模拟这个静态方法

标签 c# moq

我有这个代码:

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)
    {
        //...
    }
}

最佳答案

不能以简单的方式 模拟静态方法。您基本上有两个选择:

  1. 如果您拥有 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");
        }
    }
    
  2. 如果您不拥有 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/

相关文章:

C#模拟鼠标滚轮向下

c# - 将元素值反序列化为字符串,尽管它包含混合内容

c# - 将多行插入 MS SQL Server 并检索所有新表 ID 的背面

c# - 在模拟方法(Moq)中更改引用参数的值

c# - 如何用静态方法最小化静态类(UnitOfWork 案例)?

c# - Azure 中的实时数据库 - 监听表

c# - 有人知道输出 "Module is optimized and the debugger option ' Just My Code' is Enabled”吗?

c# - 使用最小起订量模拟具有约束的通用方法

c# - 如何验证使用正确表达式调用的模拟异步方法?

c# - Moq - 模拟类时,虚方法中的引用参数未正确更新