【问题标题】:How to pass Interface as parameter for Controller class in Substitute如何在 Substitute 中将接口作为参数传递给 Controller 类
【发布时间】:2023-03-23 19:51:01
【问题描述】:

我是 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 为 null

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

如何解决这个问题。

【问题讨论】:

    标签: asp.net-mvc nsubstitute


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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 2017-05-29
      • 2011-02-02
      • 1970-01-01
      相关资源
      最近更新 更多