NSubstitute - макет поведения параметра для любого параметра - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь издеваться IConfigurationProvider с NSubstitute. Мне нужен метод bool TryGet(string key, out string value) для возврата значений для разных ключей. Вот как то так:

var configProvider = Substitute.For<IConfigurationProvider>();
configProvider.TryGet("key1", out Arg.Any<string>()).Returns(x => 
    { x[1] = "42"; return true; });

но это не компилируется. Мне нужен метод mocked, чтобы фактически установить для параметра out соответствующее значение, независимо от того, что это за параметр - это зависимость, тестируемый модуль вызывает этот метод со своими собственными параметрами, и я просто хочу, чтобы он «возвратился» (как в возврат, заполнив параметр out) правильные значения для ключей.

Это должно дать более широкий взгляд на проблему:

var value = "";
var configProvider = Substitute.For<IConfigurationProvider>();
configProvider
.TryGet("key1", out value)
.Returns(x => { 
    x[1] = "42"; 
    return true; 
});

var otherValue = "other";
configProvider.TryGet("key1", out value);
configProvider.TryGet("key1", out otherValue);

Assert.AreEqual("42", value);      // PASS.
Assert.AreEqual("42", otherValue); // FAIL.

Мне нужно, чтобы оба утверждения были верными, поскольку этот метод будет использоваться тестируемым классом, и он может свободно передавать любой желаемый параметр, мне просто нужно заполнить его "42".

Ответы [ 2 ]

0 голосов
/ 08 августа 2019

Начиная с NSubstitute 4+, это поддерживается из коробки:

Соответствующие и ref аргументы

Сопоставители аргументов также могут использоваться без и ref (NSubstitute 4.0 и позже с C # 7.0 и позже).

calculator
    .LoadMemory(1, out Arg.Any<int>())
    .Returns(x => {
        x[1] = 42;
        return true;
    });

var hasEntry = calculator.LoadMemory(1, out var memoryValue);
Assert.AreEqual(true, hasEntry); Assert.AreEqual(42, memoryValue); 

Источник

0 голосов
/ 30 июня 2018

configProvider.TryGet("key1", out Arg.Any<string>()) недопустимый синтаксис C #, поэтому он не будет компилироваться.

Вам необходимо использовать фактическую переменную для параметра out .

Следующее работает при тестировании.

//Arrange            
var expectedResult = true;
var expectedOut = "42";
var actualOut = "other";
var anyStringArg = Arg.Any<string>();
var key = "key1";
var configProvider = Substitute.For<IConfigurationProvider>();
configProvider
    .TryGet(key, out anyStringArg)
    .Returns(x => {
        x[1] = expectedOut;
        return expectedResult;
    });

//Act
var actualResult = configProvider.TryGet(key, out actualOut);

//Assert
Assert.AreEqual(expectedOut, actualOut); // PASS.
Assert.AreEqual(expectedResult, actualResult); // PASS.
...