2010-09-07 3 views
4

Я хочу издеваться этот интерфейс, используя MoqMocking методы с Expression <Func<T,bool>> параметров с помощью Moq

IInterfaceToBeMocked { 
IEnumerable<Dude> SearchDudeByFilter(Expression<Func<Dude,bool>> filter); 
} 

я думал сделать что-то вроде

_mock.Setup(method => method.SearchDudeByFilter(x=> x.DudeId.Equals(10) && X.Ride.Equals("Harley"))). Returns(_dudes);// _dudes is an in-memory list of dudes. 

Когда я пытаюсь отлаживать тест устройства, в котором Мне нужно это издевательство, он говорит, что «выражение не допускается», указывающее на лямбду. Если это имеет значение, я использую xUnit в качестве рамки тестирования.

+1

Я предполагаю, что пропущенная закрывающая скобка является опечаткой при копировании на сайт и не отвечает, потому что я не знаю, что это могло бы быть, если оно компилируется и выходит из строя во время отладки, как вы упоминаете. – eglasius

+0

@eglasius: как насчет сейчас? – Perpetualcoder

ответ

4

Следующие прекрасные произведения для меня с Moq 4.0 Beta:

public class Dude 
{ 
    public int DudeId { get; set; } 
    public string Ride { get; set; } 
} 

public interface IInterfaceToBeMocked 
{ 
    IEnumerable<Dude> SearchDudeByFilter(Expression<Func<Dude,bool>> filter); 
} 

и тестовый модуль:

[TestMethod] 
public void TestDudes() 
{ 
    // arrange 
    var expectedDudes = new[] 
    { 
     new Dude(), new Dude() 
    }; 
    var mock = new Mock<IInterfaceToBeMocked>(); 
    mock.Setup(method => method.SearchDudeByFilter(
     x => x.DudeId.Equals(10) && x.Ride.Equals("Harley")) 
    ).Returns(expectedDudes); 

    // act 
    // Remark: In a real unit test this call will be made implicitly 
    // by the object under test that depends on the interface 
    var actualDudes = mock.Object.SearchDudeByFilter(
     x => x.DudeId.Equals(10) && x.Ride.Equals("Harley") 
    ); 

    // assert 
    Assert.AreEqual(actualDudes, expectedDudes); 
} 

Теперь, если вы что-то изменить в аргумент фактического метода не называйте будет больше испытание нет потому что метод издевательства возвращает ожидаемый результат только в том случае, если аргумент тот же:

var actualDudes = mock.Object.SearchDudeByFilter(
    x => x.DudeId.Equals(20) && x.Ride.Equals("Honda") 
); 

Замечание: методы издевательства, которые принимают лямбда-выражения, являются новой функцией, которая не была доступна в предыдущих версиях, где нам нужно использовать ограничения параметров It.Is<SomeType> и It.IsAny<SomeType>.

+0

Если один из аргументов передан как параметр, например. 'SearchDudeByFilter (int dudeId)', то действительный вызов считается непроверенным, потому что дерево выражений не совсем соответствует: «Ожидаемое обращение к макету хотя бы один раз, но никогда не выполнялось: method => method.SearchDudeByFilter (x => x.DudeId.Equals (6) && x.Ride.Equals («Harley»)) Выполненные вызовы: IInterfaceToBeMocked.SearchDudeByFilter (x => (x.DudeId.Equals (значение (MyFixture + <> c__DisplayClass33) .dudeId) AndAlso x .Ride.Equals ("Harley"))) ' –

Смежные вопросы