Нужна помощь с использованием Moq - PullRequest
2 голосов
/ 29 февраля 2012

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

public class SomeClass : ISomeInterface
    {
        public int ID { get; set; }
        public string Desc { get; set; }

        public int Create(SomeClass t)
        {
            return 5;
        }

        public int Create2(string s)
        {
            return 7;
        }
    }

    public interface ISomeInterface
    {
        int Create(SomeClass t);
        int Create2(string s);
    }

Теперь у меня есть два метода для проверки макета интерфейса

    private void TestCreate()
    {
        var mocker = new Mock<ISomeInterface>();
        mocker.Setup(x => x.Create(new SomeClass())).Returns(3);
        var result = mocker.Object.Create(new SomeClass());
    }

    private void TestCreate2()
    {
        var mocker = new Mock<ISomeInterface>();
        mocker.Setup(x => x.Create2("Test")).Returns(4);
        var result = mocker.Object.Create2("Test");
    }

TestCreate2 работает и возвращает смоделированный результат "4"
TestCreate однаковозвращает «0» вместо «3»

Что мне нужно, чтобы иметь возможность имитировать методы, которые принимают пользовательские классы в качестве аргументов, а не простые int и строки?

1 Ответ

3 голосов
/ 29 февраля 2012

Да, это потому, что вы настроили TestCreate для возврата 3, когда он получает экземпляр SomeClass, который вы передали во время вызова установки.Однако, так как вы добавляете экземпляр в строку, экземпляр, переданный во время фактического вызова Create, уже не тот.Любой из приведенных ниже вариантов решит вашу проблему ...

private void TestCreate()
{
    var mocker = new Mock<ISomeInterface>();
    mocker.Setup(x => x.Create(It.IsAny<SomeClass>())).Returns(3);
    var result = mocker.Object.Create(new SomeClass());
}

private void TestCreate()
{
    var mocker = new Mock<ISomeInterface>();
    var someClass = new SomeClass();
    mocker.Setup(x => x.Create(someClass)).Returns(3);
    var result = mocker.Object.Create(someClass);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...