Как передать интерфейс в качестве параметра для класса контроллера в замене

Я новичок в nSubstitute. И я пишу тестовый метод для своего класса контроллера. У меня есть TestMethod с именем GetDefaultStateTest(), который имеет класс 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);

Как решить эту проблему.


person user792223    schedule 03.10.2012    source источник


Ответы (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), а не заменители. Это будет зависеть от того, насколько четко определены взаимодействия с зависимостями, где вы хотите определить границы тестируемой системы и насколько тест дает вам уверенность в том, что тестируемая система работает правильно. Или, проще говоря, все, что позволяет легко и надежно тестировать. :)

Надеюсь это поможет.

person David Tchepak    schedule 03.10.2012