在單元測試裡mock Expression參數,不算少見,只是寫了之後下次遇到又忘了,今天就這樣卡了半小時,乾脆寫下來。
先定義一個 interface,參數為Expression<Func<int,bool>
public interface IRepo
{
Task<int> GetOne(Expression<Func<int,bool>> filter);
}
利用Moq的It.IsAny<>
[Fact]
public void MockWithMoq()
{
var mock = new Mock<IRepo>();
int returnVal = 1;
mock.Setup(x => x.GetOne(It.IsAny<Expression<Func<int, bool>>>())).Returns(() => Task.FromResult<int>(returnVal));
var repo = mock.Object;
Assert.Equal(returnVal, repo.GetOne(value=>value>1).Result);
}
利用NSub的Arg.Any<>
[Fact]
public void MockWithNSub()
{
var repo = Substitute.For<IRepo>();
int returnVal = 1;
repo.GetOne(Arg.Any<Expression<Func<int, bool>>>()).Returns(Task.FromResult<int>(returnVal));
Assert.Equal(returnVal, repo.GetOne(value => value > 1).Result);
}
其實只是很簡單的造樣mock,但不知道為什麼再次遇到都會卡關,希望下次不要再忘掉怎麼寫了!!