模拟方法由于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);

模拟方法由于NULL而失败

问题是您的User没有Appointments,因此GetAppointment返回null。当您创建User时,您可以设置Appointments吗?如果没有,我建议在User类中添加一个接口(比如IUser)并传入它,这样您就可以传入IUser的模拟并模拟GetAppointment方法。