gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:10:52 25 4
gpt4 key购买 nike

我有这个代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com