C# – How to Mock a Predicate in a Function using Moq

cmoq

I want to mock Find method which expects a predicate using Moq:

public PurchaseOrder FindPurchaseOrderByOrderNumber(string purchaseOrderNumber)
    {
        return purchaseOrderRepository.Find(s => s.PurchaseOrderNumber ==    purchaseOrderNumber).FirstOrDefault();
    }

My repository method

IList<TEntity> Find(Func<TEntity, bool> where);

I used following test method

[TestMethod]
  public void CanGetPurchaseOrderByPurchaseOrderNumber()
 {

      _purchaseOrderMockRepository.Setup(s => s.Find(It.IsAny<Func<PurchaseOrder, bool>>()).FirstOrDefault())
          .Returns((Func<PurchaseOrder, bool> expr) => FakeFactory.GetPurchaseOrder());

      _purchaseOrderService.FindPurchaseOrderByOrderNumber("1111");


 }

It gives me the following error:

ServicesTest.PurchaseOrderServiceTest.CanGetPurchaseOrderByPurchaseOrderNumber
threw exception:
System.NotSupportedException: Expression references a method that does not belong to the mocked object: s =>
s.Find(It.IsAny()).FirstOrDefault

How do I resolve this?

Best Answer

I found the answer :)

I changed the test as follows and removed the call to FirstOrDefault:

[TestMethod]
  public void CanGetPurchaseOrderByPurchaseOrderNumber()
 {

      _purchaseOrderMockRepository.Setup(s => s.Find(It.IsAny<Func<PurchaseOrder, bool>>()))
          .Returns((Func<PurchaseOrder, bool> expr) => new List<PurchaseOrder>() {FakeFactory.GetPurchaseOrder()});

      _purchaseOrderService.FindPurchaseOrderByOrderNumber("1111");

      _purchaseOrderMockRepository.VerifyAll();


 }