我有一些旧代码,并且正在对我所做的增强进行测试。我有一个名为SiteSession的类,已经提取出一个名为ISiteSession的接口,以便可以在调用该类时注入依赖项。
public class SiteSession : ISiteSession
{
public SiteSession(string userName, string externalRef, IePermitProAdapterClient ePermitService)
{
//.......
}
//...
}
调用类具有一个构造函数,其中依赖项被注入到正在进行测试的控制器CustomerDetails中。
private readonly ICustomerDetails _customerDetails;
private ISiteSession _siteSession;
public SsoController(ICustomerDetails customerDetails, ISiteSession siteSession)
{
_customerDetails = customerDetails;
_siteSession = siteSession;
}
public ActionResult CustomerDetails(CustomerDetails customerDetails)
{
//.....
//...
//...
_siteSession = new SiteSession(customer.Username, customer.CustomerRef, ePermitService);
//.....
//...
//...
}
现在我的测试方法已经模拟了依赖关系,对于这个控制器或代码的任何其他部分创建的任何测试都没有问题。但是当调用此控制器 CustomerDetails
的测试时,实际构造函数调用会发生在 SiteSession
类中,我无法注入模拟并打破真实调用。我的测试代码如下:
private Mock<ISiteSession> _siteSession;
在测试的设置方法中:
_siteSession = new Mock<ISiteSession>();
在测试的方法中:_siteSession.Setup(x => x.Token).Returns("TestToken");
我尝试了类似于: _siteSession = new Mock<SiteSession>(_customer.Object.Username, _customer.Object.CustomerRef, null);
由于类型转换不同,显然这是不正确的,我无法想象如何模拟SiteSession类以避免调用实际构造函数。我正在使用NInject、NUnit和Moq。