Методы мошенничества с параметром Expression <Func <T, bool >> с использованием Moq - PullRequest
4 голосов
/ 07 сентября 2010

Я хочу смоделировать этот интерфейс, используя 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 Ответ

6 голосов
/ 21 сентября 2010

Следующее прекрасно работает для меня с 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>.

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