【问题标题】:GetString(IStringLocalizer, String, Object[]) returns null when Unit-TestingGetString(IStringLocalizer, String, Object[]) 在单元测试时返回 null
【发布时间】:2018-10-31 20:00:13
【问题描述】:

我有一个测试类,它在某些时候使用 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}"
    }
}

这就是我构建测试的方式:

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);
    }
}

运行测试将失败并出现以下错误:

SomeMethod() 失败

  • Assert.Equal() 失败
  • 预计:我的日期:31.10.2018
  • 实际:(空)

通常我会简单地假设方法GetString(IStringLocalizer, String, Object[]) 不能处理格式字符串,但由于我在生产环境中使用它并且它有效,我不知道如何解决这个问题。对我来说,似乎我已经正确地模拟了 _localizer 依赖项。否则GetString(IStringLocalizer, String) 不会返回格式字符串。

编辑:

澄清:

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

【问题讨论】:

  • 如果模拟返回 null 这通常意味着模拟在调用时没有得到预期的结果。
  • @Nkosi 它不是返回 null 的模拟,它在 SomeMethod() 中使用的扩展方法 GetString(IStringLocalizer, String, Object[]) 将不起作用。 SomeMethod2() 中使用的扩展方法 GetString(IStringLocalizer, String) 工作得很好。

标签: c# unit-testing localization moq .net-core-2.1


【解决方案1】:

如果您查看 GetString 扩展方法的代码,则该版本仅采用字符串 does use the method you have mocked,但采用 takes extra parameters doesn't 的版本:

return stringLocalizer[name, arguments];

所以你需要嘲笑这个additional method of IStringLocalizer

LocalizedString this[string name, params object[] arguments] { get; }

我猜是这样的:

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

【讨论】:

  • 就在这里。我只是在寻找源头。干得好。
  • @Nkosi 一定喜欢开源!
  • 当然,这失去了检查插入到字符串中的值的可能性,因为我会返回My Date: {0:d},但它可以工作。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 2020-11-02
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多