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));
}
}
GetForms가 가상 메서드가 아니어야합니까? – rla4
@ rla4, 왜 그렇게 말합니까? 조롱 된 메소드가 가상 일 필요가 있습니까? – mam8cc
다릅니다. 나는 JustMock에 익숙하지 않다. 그러나 많은 조롱 프레임 워크는 다이나믹스 (dynamicix) 프록시에 의존한다. 가상 메소드가 필요하다. – rla4