我是nSubstitute的新手。我正在为我的控制器类编写测试方法。我有一个名为GetDefaultStateTest()的TestMethod,它具有替换类,如下所示
[TestMethod]
public void GetDefaultStateTest()
{
var _GetDefaultState = Substitute.For<CustomerController>(ICustomer cus);
Assert.IsNotNull(_GetDefaultState.GetDefaultState());
}
因为我的控制器类具有参数化构造函数,如下所示。
public class CustomerController : Controller
{
private readonly ICustomer _customer;
public CustomerController(ICustomer customer)
{
_customer = customer;
}
public string GetDefaultState()
{
// Get default state from settings table
List<tblSettings> settings = new List<tblSettings>();
// Calling service method GetSettings
settings = _customer.GetSettings();
var defaultState = from setting in settings
where setting.Desc == "DefaultState"
select setting.Settings;
string strState = "";
foreach (var oState in defaultState)
{
strState = oState;
break;
}
return strState;
}
}
运行测试方法时,会引发空引用问题。因为参数ICustomer为null
var _GetDefaultState = Substitute.For<CustomerController>(ICustomer cus);
如何解决此问题。
答案 0 :(得分:1)
如果你正在测试你的控制器类,那么你不想替换它,你想要使用一个真实的(否则你只是测试假对象“工作”:))。 想要替换的地方是该类的依赖项,在本例中为ICustomer
。
[TestMethod]
public void GetDefaultStateTest()
{
var customer = Substitute.For<ICustomer>();
var controller = new CustomerController(customer);
Assert.IsNotNull(controller.GetDefaultState());
}
然后,您可能想要伪造ICustomer.GetSettings()
方法,以便测试控制器对该数据执行的操作:
[TestMethod]
public void GetDefaultStateTestFromSettings()
{
var customer = Substitute.For<ICustomer>();
customer.GetSettings().Returns(somethingSensible);
var controller = new CustomerController(customer);
Assert.AreEqual(expectedDefaultState, controller.GetDefaultState());
}
顺便说一下,有时使用真实对象(比如ICustomer
的真实实现)而不是替代品更有意义。这取决于与依赖项的交互定义得如何明确,您希望在哪里定义被测系统的边界,以及测试给您带来的测试系统正确运行的可信度。或者更简单地说,无论是什么使得测试变得容易和可靠。 :)
希望这有帮助。