0

我是 nSubstitute 的新手。我正在为我的控制器类编写测试方法。我有一个名为 GetDefaultStateTest() 的 TestMethod,它具有 Substitute 类,如下所示

[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 为空

var _GetDefaultState = Substitute.For<CustomerController>(ICustomer cus);

如何解决这个问题。

4

1 回答 1

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)而不是替代品更有意义。这将取决于与依赖项交互的定义有多完善、您希望在哪里定义被测系统的边界以及测试给您的被测系统正常工作的信心程度。或者更简单地说,任何使测试变得容易和可靠的东西。:)

希望这可以帮助。

于 2012-10-03T23:23:35.993 回答