ekenman
ekenman

Reputation: 995

Moq Verify that Method was called with any expression

I'm new to Moq and I'm trying to Mock my repository.

The method I'm Writing a unit test for is calling the repository like this:

var paymentState = _agreementPaymentStateRepository.SingleOrDefault(
                         s => s.Agreement.ID == agreementID);

I'm trying to set up my moq like this:

_agreementPaymentStateRepositoryMock
         .Setup(m => m.SingleOrDefault(s => s.AgreementID == 1))
         .Returns(AgreementPayMentStateMocks.GetOne);

I pass my mocked repository to the class but the paymentState variable is null after the call is made. (I would gladely skip specifying the expression as well).

Any help is much appreciated.

public PaymentState GetPaymentState(int agreementID)
    {
        try
        {
            _log.AgreementPaymentStateServiceGetStateStart(agreementID);
            var paymentState =
                _agreementPaymentStateRepository.SingleOrDefault(s => s.Agreement.ID == agreementID);

            var stateToGet = MapStateToGet(paymentState);

            _log.AgreementPaymentStateServiceGetStateReturn(agreementID, paymentState.LatestStatus);
            return stateToGet;
        }
        catch (Exception ex)
        {
            _log.ServiceException(ex.ToString());
            throw;
        }
    }

and the test:

 var paymentState = AgreementPayMentStateMocks.GetPayMentState();

        _agreementPaymentStateRepositoryMock.Setup(m => m.SingleOrDefault(s => s.AgreementID == 1)).Returns(AgreementPayMentStateMocks.GetOne);

        var service = new AgreementPaymentStateService(_agreementPaymentStateRepositoryMock.Object, _log.Object);
        var result = service.GetPaymentState(1);

        _agreementPaymentStateRepositoryMock.Verify(m => m.Match(aps => aps.SingleOrDefault(s => s.AgreementID == 1)), Times.Exactly(1));

Upvotes: 2

Views: 1823

Answers (1)

bdukes
bdukes

Reputation: 156055

Instead of having a concrete predicate in the SingleOrDefault call, use Moq's It.IsAny<T> method:

_agreementPaymentStateRepositoryMock
         .Setup(m => m.SingleOrDefault(It.IsAny<Expression<Func<bool,PaymentState>>>()))
         .Returns(AgreementPayMentStateMocks.GetOne);

Upvotes: 4

Related Questions