C# 单元测试时,GetString(IStringLocalizer,String,Object[])返回null

C# 单元测试时,GetString(IStringLocalizer,String,Object[])返回null,c#,unit-testing,localization,moq,.net-core-2.1,C#,Unit Testing,Localization,Moq,.net Core 2.1,我有一个测试类,它在某个时候使用 GetString(IStringLocalizer,String,Object[])扩展方法 除测试外,以下操作有效 public class ClassToTest { private readonly IStringLocalizer<SharedResource> _localizer; public AnalyticsLogic(IStringLocalizer<SharedResource> loca

我有一个测试类,它在某个时候使用
GetString(IStringLocalizer,String,Object[])
扩展方法

除测试外,以下操作有效

public class ClassToTest
{
    private readonly IStringLocalizer<SharedResource> _localizer;
    
    public AnalyticsLogic(IStringLocalizer<SharedResource> localizer)
    {
        _localizer = localizer;
    }
    
    public async Task<string> SomeMethod()
    {
        return _localizer.GetString("key", DateTime.Today));  // "My Date: 31.10.2018" - will return null when testing
    }       

    public async Task<string> SomeMethod2()
    {
        return _localizer.GetString("key");  // "My Date: {0:d}"
    }
}
公共类ClassToTest
{
专用只读IStringLocalizer\u localizer;
公共分析语言(IStringLocalizer)
{
_定位器=定位器;
}
公共异步任务方法()
{
return _localizer.GetString(“key”,DateTime.Today));/“My Date:31.10.2018”-测试时将返回null
}       
公共异步任务SomeMethod2()
{
返回_localizer.GetString(“key”);/“我的日期:{0:d}”
}
}
以下是我如何建立我的测试:

public class ClassToTestTest
{
    private readonly ClassToTest _testee;
    private readonly Mock<IStringLocalizer<SharedResource>> _localizerMock = new Mock<IStringLocalizer<SharedResource>>();

    public ClassToTestTest()
    {
        _testee = new ClassToTest(_localizerMock.Object);

        _localizerMock.Setup(lm => lm["key"]).Returns(new LocalizedString("key", "My Date: {0:d}"));
    }



    [Fact]
    public async Task SomeMethod()
    {
        var result = await _testee.SomeMethod();

        Assert.Equal($"My Date: {new DateTime(2018, 10, 31):d}", result);
    }

    [Fact]
    public async Task SomeMethod2()
    {
        var result = await _testee.SomeMethod2();

        Assert.Equal("My Date: {0:d}", result);
    }
}
公共类ClassToTest
{
私有只读类测试对象;
private readonly Mock_localizerMock=new Mock();
公共类totest()
{
_testee=newclasstotest(_localizerMock.Object);
_Setup(lm=>lm[“key”])。返回(新的LocalizedString(“key”,“我的日期:{0:d}”);
}
[事实]
公共异步任务方法()
{
var result=wait_testee.SomeMethod();
Assert.Equal($“我的日期:{new DateTime(2018,10,31):d}”,结果);
}
[事实]
公共异步任务SomeMethod2()
{
var result=wait_testee.SomeMethod2();
等于(“我的日期:{0:d}”,结果);
}
}
运行测试将失败,并出现以下错误:

SomeMethod()失败

  • Assert.Equal()失败
  • 预计日期:2018年10月31日
  • 实际:(空)
通常我会简单地假设方法
GetString(IStringLocalizer,String,Object[])
无法处理格式字符串,但由于我在生产环境中使用它,并且它可以工作,我不知道如何修复它。在我看来,似乎我已经正确地模拟了
\u定位器
依赖关系。否则,
GetString(IStringLocalizer,String)
将不会返回格式字符串

编辑: 请澄清:

  • 测试
    SomeMethod()
    将失败
  • 测试
    SomeMethod2()
    将成功

如果您查看
GetString
扩展方法的代码,该版本只接受一个字符串,但以下版本:

所以你需要嘲笑一下:

我猜是这样的:

_localizerMock.Setup(lm => lm["key", It.IsAny<object[]>()])
    .Returns(new LocalizedString("key", "My Date: {0:d}"));
\u localizerMock.Setup(lm=>lm[“key”,It.IsAny())
.Returns(新的本地化字符串(“key”,“我的日期:{0:d}”);

如果查看
GetString
扩展方法的代码,该版本只接受一个字符串,但以下版本:

所以你需要嘲笑一下:

我猜是这样的:

_localizerMock.Setup(lm => lm["key", It.IsAny<object[]>()])
    .Returns(new LocalizedString("key", "My Date: {0:d}"));
\u localizerMock.Setup(lm=>lm[“key”,It.IsAny())
.Returns(新的本地化字符串(“key”,“我的日期:{0:d}”);

如果mock返回null,通常意味着mock在调用时没有得到预期的结果。@Nkosi返回null的不是mock,而是
GetString(IStringLocalizer,String,Object[])中使用的扩展方法
SomeMethod()
不起作用。
SomeMethod2()
中使用的扩展方法
GetString(IStringLocalizer,String)
工作得很好。如果模拟返回null,通常意味着模拟在调用时没有得到预期的结果。@Nkosi返回null的不是模拟,而是扩展方法
GetString(IStringLocalizer,String,Object[])
用于将不起作用的
SomeMethod()
中。在
SomeMethod2()
中使用的扩展方法
GetString(IStringLocalizer,String)
工作得很好。就在这里。我只是在寻找源头。干得好。@Nkosi一定喜欢开源!当然,这会减少检查已插入字符串的值的可能性,因为我将返回
mydate:{0:d}
,但它可以工作。非常感谢。就在这里。我只是在寻找源头。干得好。@Nkosi一定喜欢开源!当然,这会减少检查已插入字符串的值的可能性,因为我将返回
mydate:{0:d}
,但它可以工作。谢谢。
_localizerMock.Setup(lm => lm["key", It.IsAny<object[]>()])
    .Returns(new LocalizedString("key", "My Date: {0:d}"));