2013-10-14 4 views
5

MVC4 애플리케이션에 대한 테스트를 작성하고 있으며 컨트롤러 작업을 구체적으로 테스트하고 있습니다. 제목에서 언급했듯이 테스트는 테스트 데이터를 반환하는 대신 서비스 (WCF)에 여전히 영향을 미칩니다. 나는이 컨트롤러가 :조롱 된 객체 여전히 서비스를 요청하는 전화

public class FormController : Controller 
{ 
    public SurveyServiceClient Service { get; set; } 
    public SurveyDao Dao { get; set; } 

    public FormController(SurveyServiceClient service = null, SurveyDao dao = null) 
    { 
     this.Service = service ?? new SurveyServiceClient(); 
     this.Dao = dao ?? new SurveyDao(Service); 
    } 

    // 
    // GET: /Form/ 

    public ActionResult Index() 
    { 
     var formsList = new List<FormDataTransformContainer>(); 
     Dao.GetForms().ForEach(form => formsList.Add(form.ToContainer())); 

     var model = new IndexViewModel(){forms = formsList}; 
     return View("Index", model); 
    } 

를 그리고이 DAO 개체를 사용

public class SurveyDao 
{ 
    private readonly SurveyServiceClient _service; 
    private readonly string _authKey; 

    public SurveyDao(SurveyServiceClient serviceClient) 
    { 
     _service = serviceClient; 
    } 

    .... 

    public FormContract[] GetForms() 
    { 
     var forms = _service.RetrieveAllForms(); 
     return forms; 
    } 

을 그리고 이것은 JustMock, GetForms에 모의() 헬퍼 클래스에 몇 가지 테스트 데이터를 반환하여 내 테스트입니다 :

[TestClass] 
public class FormControllerTest 
{ 
    private SurveyDao mockDao; 
    private SurveyServiceClient mockClient; 

    public FormControllerTest() 
    { 
     mockClient = Mock.Create<SurveyServiceClient>(); 
     mockDao = Mock.Create<SurveyDao>(mockClient); 
    } 

    [TestMethod] 
    public void TestIndexAction() 
    { 
     //Arrange 
     var controller = new FormController(mockClient, mockDao); 
     Mock.Arrange(() => mockDao.GetForms()).Returns(TestHelpers.FormContractArrayHelper); 

     //Act 
     var result = controller.Index() as ViewResult; 

     //Assert 
     Assert.IsInstanceOfType(result.Model, typeof(IndexViewModel)); 
    } 
} 

내 문제는 테스트를 실행할 때 서비스가 여전히 호출되고 있다는 것입니다. 필자는 Fiddler를 사용하여 테스트를 디버깅하고 서비스의 테스트 데이터로 채워지는 "결과"의 값을 검사하는 것으로 확인했습니다.

편집 : 테스트는 지금과 같다, 그래서 내가하는 [TestInitialize] 함수가 될 수있는 테스트 생성자를 변경 한

다음 JustMock manual는 설명

[TestClass] 
public class FormControllerTest 
{ 
    private SurveyDao mockDao; 
    private SurveyServiceClient mockClient; 

    [TestInitialize] 
    public void Initialize() 
    { 
     mockClient = Mock.Create<SurveyServiceClient>(); 
     mockDao = Mock.Create<SurveyDao>(Behavior.Strict); 
    } 

    [TestMethod] 
    public void TestIndexAction() 
    { 
     //Arrange 
     var controller = new FormController(mockClient, mockDao); 
     Mock.Arrange(() => mockDao.GetForms()).Returns(TestHelpers.FormContractArrayHelper); 

     //Act 
     var result = controller.Index() as ViewResult; 

     //Assert 
     Assert.IsInstanceOfType(result.Model, typeof(IndexViewModel)); 
    } 
} 
+1

GetForms가 가상 메서드가 아니어야합니까? – rla4

+0

@ rla4, 왜 그렇게 말합니까? 조롱 된 메소드가 가상 일 필요가 있습니까? – mam8cc

+1

다릅니다. 나는 JustMock에 익숙하지 않다. 그러나 많은 조롱 프레임 워크는 다이나믹스 (dynamicix) 프록시에 의존한다. 가상 메소드가 필요하다. – rla4

답변

3

JustMock에 올바른 어셈블리를 사용하고 있는지 확인하십시오. 몇 가지 다른 것들이 있습니다 (VisualBasic, Silverlight, JustMock).JustMock은 프로젝트에 포함시켜야하는 것입니다.

올바른 것을 포함시키지 않으면 설명하는 동작이 제대로 수행되지 않습니다 (올바르게 스텁되지 않은 메서드).

1

(내게로 하이라이트) 기본적 Telerik JustMock으로

느슨한 모의 객체를 사용하고를 호출 할 수 있습니다어떤 유형의 어떤 방법으로 아무리 메서드 호출이 배열되어 있는지 여부를 사용자가 호출 할 수 있습니다. 모의 당신의 Create() 메서드를 호출 할 때

이 동작을 제어 할 수있다

var foo = Mock.Create<IFoo>(Behavior.Strict); 

당신이 명시 적으로 특정 메소드를 구현하지 않은 경우 mock 객체가 무엇을해야하는지 지정할 수 있습니다. 귀하의 경우 (나는 그것이 기본 동작이라고 생각한다) 모의는 참으로 모의하려는 객체에 대해 원래의 메소드를 호출한다.

당신은 Behavior Enumeration 열거에서 다음을 선택할 수 있습니다 :

  • 느슨한 : 명시 적으로 설정하지 않으면 기본적으로 모의 통화, 그루터기처럼 행동하도록 지정합니다.
  • RecursiveLoose : 명시 적으로 설정하지 않으면 모의 객체가 mock 객체를 반환하도록 지정합니다.
  • Strict : 모의 객체에 대한 모든 호출이 명시 적으로 설정되지 않은 경우 예외를 throw하도록 지정합니다.
  • CallOriginal : 일부 실사가 설정되지 않은 경우 모의 (mock)에 대한 모든 호출이 해당 원본 멤버를 호출하도록 지정합니다.
+0

모의이 엄격한 동작을하도록 수정되었으며 서비스는 여전히 호출 중입니다. 'mockDao = Mock.Create (Behavior.Strict); ' – mam8cc

+1

@ mam8cc : [[TestInitialize()]'] (http://msdn.microsoft.com/en-us/library/microsoft)를 추가하십시오. .visualstudio.testtools.unittesting.testinitializeattribute.aspx) 메소드를 호출하고'mockClient'와'mockDao'의 인스턴스를'FormControllerTest()'생성자 대신에 옮깁니다. 그게 효과가 있니? –

+0

아니 슬프게도, 그렇지 않습니다. 같은 결과. 약간의 추가 정보로서 SurveyDao가 모의 객체로 설정된다는 것을 디버깅을 통해 확인했습니다. – mam8cc

관련 문제