Getstring (istringlocalizer, string, object []) возвращает null при модульном тестировании.

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

  • Assert.Equal() Failure
  • Expected: My Date: 31.10.2018
  • Actual: (null)

Обычно я просто предполагаю, что метод GetString(IStringLocalizer, String, Object[]) не может обрабатывать строки формата, но поскольку я использую его в продуктивной среде, и он работает, я понятия не имею, как это можно исправить. Мне кажется, что я правильно высмеял зависимость _localizer. В противном случае GetString(IStringLocalizer, String) не вернет строку формата.

Редактировать:

В целях разъяснения:

  • Тест SomeMethod() не удастся
  • Тест SomeMethod2() пройдет успешно

если макет возвращает значение null, это обычно означает, что макет не получил ожидаемого при вызове.

Nkosi 31.10.2018 12:39

@Nkosi - это не макет, который возвращает null, это метод расширения GetString(IStringLocalizer, String, Object[]), используемый в SomeMethod(), который не будет работать. Метод расширения GetString(IStringLocalizer, String), используемый в SomeMethod2(), работает нормально.

LuckyLikey 31.10.2018 12:47
0
2
1 281
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы посмотрите на код методов расширения 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}"));

Это прямо здесь. Я просто искал источник. Хорошая работа.

Nkosi 31.10.2018 13:02

@Nkosi Должен любить открытый исходный код!

DavidG 31.10.2018 13:03

Конечно, это теряет возможность проверить значение, которое было вставлено в строку, поскольку я возвращаю My Date: {0:d}, но это работает. Большое спасибо.

LuckyLikey 31.10.2018 13:07

Другие вопросы по теме