Moq Setup override - PullRequest
       22

Moq Setup override

0 голосов
/ 28 марта 2019

Я прошел все предыдущие ответы, и ни один из них не решил мою проблему.

Допустим, у меня есть следующий код:

public interface ISomeInterface
{
    int SomeMethod(int a, string b);
}

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

public class CommonMock
{
    public Mock<ISomeInterface> MockInterface = new Mock<ISomeInterface>().Setup(x => x.SomeMethod(It.IsAny<int>(), It.IsAny<string>())).Returns(It.IsAny<int>());
}

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

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

Примерно так:

[Test]
public void TestSomeMethodSpecific()
{
    var commonMock = new CommonMock();
    commonMock.MockInterface.Setup(x => x.SomeMethod(It.IsAny<int>(), It.IsAny<string>())).Returns(42);

    // Do some test based on the new return value
}

Как мне этого добиться?

Ниже я прилагаю немного фактического кода:

Общая настройка

public class MockStore
{
    public Mock<IProcessHandler> ProcessHandler = new Mock<IProcessHandler>();
    ProcessHandler.Setup(x => x.GetCurrentProcessRunId()).Returns(It.IsAny<int>());
}

Переопределенная настройка в тестовом классе

var mockstore = new MockStore();
mockStore.ProcessHandler.Setup(x => x.GetCurrentProcessRunId()).Returns(25);

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

Ответы [ 2 ]

0 голосов
/ 26 июля 2019

У вас могут быть глобальные фиктивные объекты, которые вы изменяете по ходу работы.Например, у меня есть это:

[TestClass]
public class StoreServiceTest
{
    Mock<IAccess> mockAccess;
    Mock<IAccess> mockAccessNoData;
    Mock<IDataReader> mockReader;
    Mock<IDataReader> mockReaderNoData;
    Mock<IStoreService> mockStoreService;

А затем на TestInitiailize, я Setup реализация по умолчанию следующим образом:

mockReader = new Mock<IDataReader>();
mockReader.Setup(m => m.IsDBNull(It.IsAny<int>())).Returns(false);
mockReader.Setup(m => m.GetString(It.IsAny<int>())).Returns("stub");
mockReader.Setup(m => m.GetBoolean(It.IsAny<int>())).Returns(true);
mockReader.Setup(m => m.GetInt32(It.IsAny<int>())).Returns(32);
mockReader.SetupSequence(m => m.Read()).Returns(true).Returns(false); // setup sequence to avoid infinite loop

mockAccess = new Mock<IAccess>();
mockAccess.Setup(m => m.ReadData(It.IsAny<string>(), It.IsAny<object[]>())).Returns(mockReader.Object);

mockReaderNoData = new Mock<IDataReader>();
mockReaderNoData.Setup(m => m.Read()).Returns(false);

mockAccessNoData = new Mock<IAccess>();
mockAccessNoData.Setup(m => m.ReadData(It.IsAny<string>(), It.IsAny<object[]>())).Returns(mockReaderNoData.Object);

mockStoreService = new Mock<IStoreService>(); 

А теперь для теста по умолчанию видвсе, что я делаю, это передаю mockReader.Object, который должен иметь реализацию по умолчанию, поскольку каждый тест начинается с TestInitialize, а затем для особого случая, скажем, я хочу вернуть "sub" вместо "stub" для IDataReader 's GetString() метод, я могу сделать что-то вроде этого:

mockReader.Setup(m => m.GetString(It.IsAny<int>())).Returns((int col) => {
    if (col == 2) return "sub";
    else return "stub";
});

Надеюсь, что помогает!

0 голосов
/ 28 марта 2019

Это должно работать? Если вы создаете последующую настройку для метода, и она не является условной (без ограничений на аргументы), тогда она удаляет все предыдущие установки для метода.

Здесь вы можете увидеть мой ответ, который объясняет его исходным кодом .

Если вы хотите, чтобы множественные условные установки возвращали разные значения на основе аргументов, см. Как дважды настроить метод для разных параметров с помощью mock .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...