Вопрос

У меня есть следующий метод подписи в моем Iterface:

void SetItem(ref AddressItem item);

Я делаю ограничение параметра, как это:

IAddAddressForm form = Substitute.For<IAddAddressForm>();
AddressItem item = null;
form.SetItem(Arg.Is(item));

Но это терпит неудачу из-за реф. Если я возьму ответ, то это работает нормально. Но мне нужно пройти через ссылку здесь.

Любые идеи, как это получить?

Боковая заметка: моя конечная цель - выбросить исключение в SetiTem, если прошедшее значение равно нулю. Если вы можете помочь с этим, вы получите дополнительные очки!

Это было полезно?

Решение

NSubstitute не имеет прямой поддержки для ARG, соответствующих параметрам Ref, но в целом он будет работать с ними в порядке.

Я собираюсь предположить, что вы должны использовать ref Как указано в вашем вопросе, но, очевидно, если вы можете избежать ref Ваша API будет проще, как это тестирует (независимо от используемой формы).

В ответе на ваш непосредственный вопрос вы можете пройти ссылку, обновляя образец второго кода:

form.SetItem(ref item);

Для вашей стороны, убедитесь, что вы не пытаетесь подтолкнуть слишком много поведения в вашу замену. Я обнаружил, что всякий раз, когда я это делаю, это знак, который мне нужно для упрощения связи между классом, который я проверяет и его зависимости. (Или если мне действительно нужно много логики в поддельном объекте, я передаю код, а не создавать его; это часто может быть проще.)

Есть несколько способов получить этот звонок, чтобы бросить исключение:

form.When(x => x.SetItem(ref item)).Do(x => { throw new ArgumentNullException(); });

Это бросит исключение только при вызове с Null Ref. Вы также можете выборочно добавить это поведение в зависимости от прошедшего аргумента, хотя я бы посоветовал по этому поводу, так как это, вероятно, знак, который вы слишком сильно подталкиваете в вашу замену.

form.WhenForAnyArgs(x => x.SetItem(ref item))
    .Do(x => {
        if (x[0] == null)
            throw new ArgumentNullException();
    });

Наконец, если вы просто хотите проверить, что класс, который вы тестируете правильно, когда iAddddressForm бросает аргументное исключение, я бы, наверное, просто сделаю это:

form
    .WhenForAnyArgs(x => x.SetItem(ref item))
    .Do(x => { throw new ArgumentNullException(); });

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

Надеюсь это поможет.

ПРИМЕЧАНИЕ:

Если вы хотите использовать Arg Matcher (например Arg.Any<AddressItem>()) для out или ref Аргумент, которым вам нужно определить его вне сама вызова (это может быть погрешность TAD.

        IAddAddressForm form = Substitute.For<IAddAddressForm>();
        AddressItem item = Arg.Is<AddressItem>(y => y.Number == 14);
        form
            .When(x => x.SetItem(ref item))
            .Do(x => { throw new ArgumentNullException(); });
        var address = new AddressItem { Number = 14 };
        form.SetItem(ref address);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top