Moq Expect на IRepository прохождение выражения - PullRequest
9 голосов
/ 14 ноября 2008

Я использую этот код для проверки поведения тестируемого метода:

    _repository.Expect(f => f.FindAll(t => t.STATUS_CD == "A"))
    .Returns(new List<JSOFile>())
    .AtMostOnce()
    .Verifiable();

_ хранилище определяется как:

private Mock<IRepository<JSOFile>> _repository;

Когда мой тест запущен, я получаю следующее исключение:

Выражение t => (t.STATUS_CD = "A") не поддерживается.

Может кто-нибудь сказать мне, как я могу проверить это поведение, если я не могу передать выражение в метод Expect?

Спасибо !!

Ответы [ 5 ]

2 голосов
/ 13 июля 2009

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

    [Test]
    public void MoqTests()
    {
        var mockedRepo = new Mock<IRepository<Meeting>>();
        mockedRepo.Setup(r => r.FindWhere(MatchLambda<Meeting>(m => m.ID == 500))).Returns(new List<Meeting>());
        Assert.IsNull(mockedRepo.Object.FindWhere(m => m.ID == 400));
        Assert.AreEqual(0, mockedRepo.Object.FindWhere(m => m.ID == 500).Count);
    }

    //I broke this out into a helper as its a bit ugly
    Expression<Func<Meeting, bool>> MatchLambda<T>(Expression<Func<Meeting, bool>> exp)
    {
        return It.Is<Expression<Func<Meeting, bool>>>(e => e.ToString() == exp.ToString());
    }
1 голос
/ 14 ноября 2008

Просматривая список обсуждений Moq, я думаю, что нашел ответ:

Обсуждение Moq

Кажется, я столкнулся с ограничением платформы Moq.

Правка, я нашел другой способ проверить выражение:

http://blog.stevehorn.cc/2008/11/testing-expressions-with-moq.html

0 голосов
/ 14 ноября 2008

Попробуйте

 _repository.Expect(f => f.FindAll(It.Is<SomeType>(t => t.STATUS_CD == "A")))

Простой способ проверить наличие ошибок - убедиться, что в конце ожидаемого вызова у вас всегда есть три знака ").

0 голосов
/ 14 ноября 2008

Если вы хотите проверить, что передан правильный параметр, вы всегда можете «злоупотребить» оператором return:

bool correctParamters = true;

_repository.Expect (f => f.FindAll (It.IsAny> ()))

.Returns ((Func func) => {correctParamters = func (fakeJSOFile); вернуть новый List-JSOFile- ();})

.AtMostOnce ()

.Verifiable ();

Assert.IsTrue (correctParamters);

Это вызовет переданную функцию с нужными аргументами.

0 голосов
/ 14 ноября 2008

В Rhino Mocks вы бы сделали что-то вроде этого ...

Вместо использования Expect используйте заглушку и игнорируйте аргументы. Тогда есть -

Func<JSOFile, bool> _myDelegate;

_repository.Stub(f => FindAll(null)).IgnoreArguments()
   .Do( (Func<Func<JSOFile, bool>, IEnumerable<JSOFile>>) (del => { _myDelegate = del; return new List<JSOFile>();});

Вызовите реальный код

* Установить поддельный объект JSOFile с STATUS_CD, установленным в «A» *

Assert.IsTrue(_myDelegate.Invoke(fakeJSO));
...