문제

BaseControllerTest.preecontroller는 Propertybag 및 Context와 같은 컨트롤러 속성 설정에 충분합니다.

[TestClass]
public ProjectsControllerTest : BaseControllerTest
{
 [TestMethod]
 public void List()
 {
  // Setup
  var controller = new ProjectsController();
  PrepareController(controller);
  controller.List();

  // Asserts ...
  Assert.IsInstanceOfType(typeof(IEnumerable<Project>),controller.PropertyBag["Projects"]);
 }
}

그러나 이제 행동 속성으로 선언 된 필터를 포함하여 통합 테스트를 위해 전체 파이프 라인을 실행하려면?

편집 : View Rendering에 관심이 없으며 선언적 필터와 함께 컨트롤러 로직 만 있습니다.

나는 상당한 양의보기 설정 로직을 액션 필터로 옮기는 아이디어를 좋아하며, 추가 수준의 통합 테스트가 필요한지 확실하지 않습니까? 아니면 셀레늄으로 더 잘 수행됩니까?

도움이 되었습니까?

해결책

필터를 잡고 실행할 수 있습니다.

따라서 가정합니다 action ~이다 Action<YourController>, 그리고 controller 테스트중인 컨트롤러의 인스턴스이며

var filtersAttributes = GetFiltersFor(controller); // say by reflecting over its attributes
var filters = filtersAttributes
    .OrderBy(attr => attr.ExecutionOrder)
    .Select(attr => new { Attribute = attr, Instance = 
        (IFilter)Container.Resolve(attr.FilterType) }); // assuming you use IoC, otherwise simply new the filter type with Activator.CreateInstance or something

Action<ExecuteWhen> runFilters = when =>
{ 
    // TODO: support IFilterAttributeAware filters
    foreach (var filter in filters) 
         if ((filter.Attribute.When & when) != 0) 
             filter.Instance.Perform(when, Context, controller, controllerContext);
};

// Perform the controller action, including the before- and after-filters
runFilters(ExecuteWhen.BeforeAction);
action(controller);
runFilters(ExecuteWhen.AfterAction);

뷰 엔진을 재생하는 것은 까다 롭지 만 (가능하지만) 컨트롤러 로직과 함께 생성 된 뷰가 너무 많은 움직임과 관련이 없다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top