2012-10-03 2 views
0

저는 nSubstitute를 처음 사용합니다. 그리고 컨트롤러 클래스에 대한 테스트 메소드를 작성하고 있습니다. 나는 내 컨트롤러 클래스는 아래와 같이 매개 변수화 된 생성자를 가지고 있기 때문에 대체 클래스 가진대체 클래스에서 Controller 클래스의 매개 변수로 Interface를 전달하는 방법

[TestMethod] 
    public void GetDefaultStateTest() 
    { 
     var _GetDefaultState = Substitute.For<CustomerController>(ICustomer cus); 
     Assert.IsNotNull(_GetDefaultState.GetDefaultState()); 
    } 

아래와 같이 GetDefaultStateTest()라는 TestMethod 있습니다.

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; 
    } 
} 

테스트 메서드를 실행하는 동안 null 참조 문제가 발생합니다. 매개 변수 때문에 ICustomer가 null입니다.

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

이 문제를 해결하는 방법.

답변

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의 실제 구현) 대신 사용할 수 있습니다. 이는 의존성과의 상호 작용이 얼마나 잘 정의되어 있는지, 테스트중인 시스템의 경계를 정의하려는 경우, 테스트에서 테스트중인 시스템이 올바르게 작동하는지 얼마나 신뢰할 수 있는지에 달려 있습니다. 또는 테스트를 쉽고 안정적으로 수행하는 것이 무엇이든 더 간단하게 말하십시오. :)

희망이 도움이됩니다.

관련 문제