模拟方法由于NULL而失败
本文关键字:失败 NULL 方法 模拟 | 更新日期: 2023-09-27 18:17:11
我遇到了一个问题,在我的系统测试中的方法由于NULL引用异常而失败。我知道问题出在哪里,但我不确定如何解决。
我要测试的类,简单地说,如下所示:public class PaymentService
{
public PaymentService(ICompanyService companyService, //Other dependencies)
{
_companyService = companyService;
//Other dependencies being assigned
}
public string SetupPayment(User user, ProductVariant product,
string successUrl, string failureUrl,
string cancelUrl, string errorUrl)
{
var company = _companyService.GetCompanyById(user.GetAppointment().RegistrationNumber);
}
}
PaymentService
类有许多其他的交互,但为了这个问题,这是所有重要的。
可以看到,要在CompanyService
中调用GetCompanyId
方法,需要满足user.GetAppointment().RegistrationNumber
传入的参数。User.GetAppointment
的实现如下:
public Appointment GetAppointment()
{
// Check if user has any appointments
if (Appointments == null || Appointments.Count == 0) return null;
return Appointments.First().Appointment;
}
在我的单元测试中,我现在试图测试SetupPayment
方法,但每次它运行时,它在运行user.GetAppointment
方法时失败,因为它总是返回null
。
我在单元测试中的模拟框架是这样设置的(注意_companyService
的模拟:
var companyServiceMock = new Mock<ICompanyService>();
companyServiceMock.Setup(x => x.GetCompanyByRegistrationNumber(It.IsAny<string>()))
.Returns(new Company()
{
RegistrationNumber = "12333",
});
_paymentService = new PaymentService(_companyService, _accountService, _settings, _settingsHelper, _scheduleManagerService, _appSettingService);
问题是您的User
没有Appointments
,因此GetAppointment
返回null
。当您创建User
时,您可以设置Appointments
吗?如果没有,我建议在User
类中添加一个接口(比如IUser
)并传入它,这样您就可以传入IUser
的模拟并模拟GetAppointment
方法。