Передача Moqs It.IsAny <string>в качестве аргумента метода - PullRequest
0 голосов
/ 26 октября 2018

Сначала немного информации о моей среде разработки:

  • .Net Framework 4.5
  • Мок 4.10
  • Autofac 4.2
  • NUnit 3.11

Я пытаюсь смоделировать функцию, которая принимает строковые аргументы, и я хотел бы использовать It.IsAny<string>() для настройки. Обычно я хотел бы, чтобы это так:

using ( AutoMock mock = AutoMock.GetLoose() ) {
    mock.Mock<SomeInterface>()
                .Setup( x => x.someFunction(
                    It.IsAny<string>(),
                    It.IsAny<string>(),
                    It.IsAny<string>() ) );
//...
}

Но теперь я хотел бы вызвать функцию, которая выполняет настройку, поэтому мне не нужно копировать, вставлять приведенный выше код и делать мои модульные тесты немного «лучше выглядящими». Я представляю что-то вроде этого:

using ( AutoMock mock = AutoMock.GetLoose() ) {
    UnknownType anyString = It.IsAny<string>();
    setup( mock, anyString );
//...
}

void setup( Automock mock, UnknownType anyString ){
    mock.Mock<SomeInterface>()
            .Setup( x => x.someFunction( anyString, anyString, anyString ) );     
}

Кто-нибудь знает решение для этого? Когда я использую string или даже var в качестве неизвестного типа, переменная anyString удерживает значение null после UnknownType anyString = It.IsAny<string>();. Заранее спасибо за ваши ответы.

Дальнейшее описание:

Мне нужно указать разные значения для каждого аргумента. Так это может выглядеть так:

using ( AutoMock mock = AutoMock.GetLoose() ) {
   UnknownType string1 = It.IsAny<string>;
   UnknownType string2 = It.Is<string>( s => s.Equals( "Specific string" )  );
   UnknownType string3 = It.IsAny<string>;
   setup( mock, string1, string2, string3 );
//...           
}

private static void setup( AutoMock mock, 
   UnknownType string1, UnknownType string2, UnknownType string3 ) {
   mock.Mock<SomeInterface>().Setup( x => x.someFunction( string1, string2, string3 ) );
}

1 Ответ

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

It.* предназначен для использования в качестве Setup аргументов выражения и не передается в качестве параметров / переменных, поскольку по умолчанию они возвращают null .

Насколько мне известно, то, что вы запрашиваете, кажется невозможным.

Самое близкое, что я могу придумать, используя дженерики, - это создать метод расширения для действия.на auto mock, который принимает желаемое выражение для mock

public static class AutomockExtension {
    public static Moq.Language.Flow.ISetup<T> Setup<T>(this Automock mock, Expression<Action<T>> expression) where T : class {
        return mock.Mock<T>().Setup(expression);
    }

    public static Moq.Language.Flow.ISetup<T, TValue> Setup<T, TValue>(this Automock mock, Expression<Func<T, TValue>> expression) where T : class {
        return mock.Mock<T>().Setup(expression);
    }
}

, что на самом деле не сильно спасает вас в терминах или повторяющемся коде, поскольку вам все равно придется вызывать It.* в выражении

using ( AutoMock mock = AutoMock.GetLoose() ) {

    mock.Setup<SomeInterface>(_ => 
        _.someFunction(
            It.IsAny<string>(),
            It.Is<string>( s => s.Equals( "Specific string" ),
            It.IsAny<string>()
        ) 
    );

    //...           
}

Оригинальный ответ

Используйте обобщенные значения

void setup<T>(Automock mock){
    mock.Mock<SomeInterface>()
            .Setup(_ => _.someFunction(
                It.IsAny<T>(), 
                It.IsAny<T>(), 
                It.IsAny<T>()));     
}

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

using ( AutoMock mock = AutoMock.GetLoose() ) {
    setup<string>(mock);
    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...