Свойство Moq Index Обратный вызов с SetupGet - PullRequest
2 голосов
/ 11 октября 2019

Я пытаюсь написать тест для метода расширения, который добавляет префикс для ключа, который отправляется в свойство индекса IConfiguration:

расширение:

public static class IConfigurationExt
{
    public static string GetDomainValue(this IConfiguration configuration, string key)
    {
        return configuration["domain." + key];
    }
}

test:

[Test]
public void GetInexKeyAsCallback()
{
    string keySet = null;

    Mock<IConfiguration> configurationMock = new Mock<IConfiguration>(MockBehavior.Strict);

    configurationMock.SetupGet(p => p[It.IsAny<string>()])
                        .Callback(() => keySet = "assign key here") // <<< the part here needs the parameter
                        .Returns("mock");

    IConfiguration configuration = configurationMock.Object;

    var result = configuration.GetDomainValue("testKey");

    Assert.AreEqual(expected: "domain.testKey", actual: keySet);
}

Я пытаюсь увидеть, что, когда получатель выполняется и ключ отправляется, он приходит с префиксом к свойству index в IConfiguration. Моя проблема в том, что я не могу заставить часть обратного вызова работать с таким параметром, как: .Callback<string>((key) => keySet = key), например.

Есть ли способ получить ключ, который был отправлен в индексированное свойство? Работает с SetupSet, но не с SetupGet

Спасибо!

Ответы [ 3 ]

3 голосов
/ 11 октября 2019

SetupGet не имеет Callback, который разрешает доступ к переданному параметру.

Вместо этого используйте Setup, а затем Callback может получить доступ к переданному аргументу, включив параметр в делегат

public void GetInexKeyAsCallback() {
    //Arrange
    string actual = null;
    string expected = "domain.testKey";

    Mock<IConfiguration> configurationMock = new Mock<IConfiguration>(MockBehavior.Strict);

    configurationMock
        .Setup(_ => _[It.IsAny<string>()]) // <-- Use Setup
        .Callback((string arg) => actual = arg) // <<< the part here gets the parameter
        .Returns("mock");

    IConfiguration configuration = configurationMock.Object;

    //Act
    var result = configuration.GetDomainValue("testKey");

    //Assert
    Assert.AreEqual(expected, actual);
}
2 голосов
/ 11 октября 2019

Хотя у вас уже есть ответ, я хотел бы предложить другой подход, который лучше всего подходит для описанной проблемы.

Я пытаюсь увидеть, что, когда получатель выполняется и ключ отправляется, он приходит с префиксом к свойству index IConfiguration.

The *Для такого сценария следует использовать 1007 * вместо Callback. Вы можете переписать свой тест примерно так:

// Arrange
const string expectedKey = "testKey";
Mock<IConfiguration> configurationMock = new Mock<IConfiguration>(MockBehavior.Strict);
configurationMock.SetupGet(p => p[It.IsAny<string>()]).Returns("mock");

// Act
_ = configurationMock.Object.GetDomainValue(expectedKey);

// Assert
configurationMock.Verify(m => m[$"domain.{expectedKey}"], Times.Once);

0 голосов
/ 11 октября 2019

Из памяти вам нужно изменить

Callback(() =>

на

Callback<string>( x =>
...