Как настроить MVC mock.Setup и .Returns для метода репозитория, который имеет выходной параметр и тип возвращаемого значения - PullRequest
1 голос
/ 12 февраля 2020

Мне нужно смоделировать метод в хранилище, но у метода есть выходной параметр и тип возвращаемого значения (класса класса ExBool, который устанавливает состояния и сообщения об ошибках). Нужно вернуть список настроек аккаунта. Эти настройки применяются к данным, отправленным обратно из представления. Я бы предпочел получить реальные значения (accountSetups) из базы данных, но, похоже, мне нужно будет создать фиктивные значения в макете этого хранилища. Таким образом, вопрос заключается в том, как установить фиктивные значения в извлеченных «accountSetups»?

. Тестовый метод проверит, имеет ли входящая объединенная строка формат, указанный в настройках account.

Репозиторий (который вводится в контроллер (с Ninject)):

public interface IAccountSetupBo
{
    ExBool List(out List<AccountSetup> accountSetups);
}

Мой тест:

ExBool result = new ExBool();  // this is the method's return type
private List<AccountSetup> accountSetups;  //This is the list of setups reurned by the 'out' parameter, in the List method.

[TestInitialize]
    public void SetUp()
    {
        // Inject with Mock, which creates a proxy..not a concrete instance
        mockedAccountSetupBo = new Mock<IAccountSetupBo>();
        mockedAccountSetupBo
            .Setup(x => x.List(out accountSetups))
            .Returns(result);
    }

Спасибо

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

заполнить коллекцию до установки

ExBool result = new ExBool();  // this is the method's return type

[TestInitialize]
public void SetUp() {

    List<AccountSetup> accountSetups = new List<AccountSetup>() {
        //...populate with desired objects
    }

    // Inject with Mock, which creates a proxy..not a concrete instance
    mockedAccountSetupBo = new Mock<IAccountSetupBo>();
    mockedAccountSetupBo
        .Setup(x => x.List(out accountSetups))
        .Returns(result);
}

, и она будет лениво оценена при вызове модели.

0 голосов
/ 12 февраля 2020

Другим способом может быть использование delegate в хуке Callback, предоставленном moq. Примерно так:

public delegate void SetupOutList(out List<AccountSetup> a);

mockedAccountSetupBo
        .Setup(x => x.List(out It.Ref<List<AccountSetup>>.IsAny))
        .Callback(new SetupOutList((out List<AccountSetup> a) => 
        {
            a = new List<AccountSetup>{...}; // initialize your list
        })
        .Returns(result);

Посмотрите официальную документацию о обратных вызовах .

...