【发布时间】:2013-09-18 04:12:28
【问题描述】:
我是 Moq 的新手,我正在尝试模拟我的存储库。
我正在为其编写单元测试的方法是这样调用存储库:
var paymentState = _agreementPaymentStateRepository.SingleOrDefault(
s => s.Agreement.ID == agreementID);
我正在尝试这样设置我的起订量:
_agreementPaymentStateRepositoryMock
.Setup(m => m.SingleOrDefault(s => s.AgreementID == 1))
.Returns(AgreementPayMentStateMocks.GetOne);
我将我的模拟存储库传递给该类,但在调用后 paymentState 变量为空。 (我也很乐意跳过指定表达式)。
非常感谢任何帮助。
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;
}
}
和测试:
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));
【问题讨论】:
-
如果可以的话,把所有代码都放在这里,有时你认为这不是问题的原因。
-
SingleOrDefault 不是扩展方法对吧?
-
@Ufuk,它的表达式传递到存储库...
-
顺便说一句,你可以把
.Verifiable()放在Setup的末尾,而不是做同样的事情,然后调用_agreementPaymentStateRepositoryMock.Verify();