mock參數為Expression/Linq的方法

在單元測試裡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,但不知道為什麼再次遇到都會卡關,希望下次不要再忘掉怎麼寫了!!