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