如何在Interface中传递Interface作为Controller类的参数

时间:2012-10-03 11:10:39

标签: asp.net-mvc nsubstitute

我是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);

如何解决此问题。

1 个答案:

答案 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的真实实现)而不是替代品更有意义。这取决于与依赖项的交互定义得如何明确,您希望在哪里定义被测系统的边界,以及测试给您带来的测试系统正确运行的可信度。或者更简单地说,无论是什么使得测试变得容易和可靠。 :)

希望这有帮助。