GetString (IStringLocalizer, String, Object []) возвращает ноль при модульном тестировании - PullRequest
0 голосов
/ 31 октября 2018

У меня есть тестовый класс, который в какой-то момент локализует строку с использованием 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) не вернет строку формата.

Edit:

Для уточнения:

  • Тест SomeMethod() не пройдёт
  • Тест SomeMethod2() будет успешным

1 Ответ

0 голосов
/ 31 октября 2018

Если вы посмотрите на код для методов расширения GetString, версия, которая принимает только строку , использует метод, который вы смоделировали , но версия, которая принимает дополнительные параметры, не

return stringLocalizer[name, arguments];

Так что вы должны насмехаться над этим дополнительным методом из 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}"));
...