2009-04-05 7 views
5

나는 다음을 가지고있다 Action Method 나는 moq 시험에 노력하고있다. AcceptVerbs에 주목하십시오. 내가 그걸 시험하고 있는지 확인해야 해.ASP.NET에서 Moq를 사용하여 HTTP-Post를 테스트하는 방법은 무엇입니까?

여기가 방법입니다.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create([Bind(Include = "Subject, Content")]Post post, 
    HttpPostedFileBase imageFileName) 
{ 
    ... 
} 

여기 ... 내가 가지고있는 MOQ 코드의

[TestMethod] 
public void Create_Action_snip_sniop_When_Http_Post_Is_Succesful() 
{ 
    // Arrange. 
    var mock = new Mock<ControllerContext>(); 
    mock.SetupGet(m => m.HttpContext.Request.HttpMethod).Returns("POST"); 

    // Snip some other arrangements. 

    var controller = PostController; 
    controller.ControllerContext = mock.Object; 

    // Act. 
    var viewResult = controller.Create(post, image.Object) as ViewResult; 

    // Assert. 
    Assert.IsNotNull(viewResult); 

    // TODO: Test that the request was an Http-Post. 

내가 게시물이었다 요청을 확인하려면 어떻게해야합니까?

답변

9

일반적으로 ControllerActionInvoker에서 Mvc "스택"의 일부로 호출되기 때문에 단위 테스트로 실행할 때 속성이 호출되지 않습니다. 이와 같은 경우에 수행 한 작업은 올바른 속성이 올바른 매개 변수가있는 작업에 적용되도록 테스트를 작성하는 것입니다. 그러면 프레임 워크가 올바르게 작동 할 것이라고 확신합니다. 이렇게

반사가 필요합니다

public void Only_posts_are_allowed_to_my_action() 
{ 
     var method = typeof(MyController).GetMethod("MyAction"); 
     var attribute = method.GetCustomAttributes(typeof(AcceptVerbsAttribute),false) 
          .Cast<AcceptVerbsAttribute>() 
          .SingleOrDefault(); 

     Assert.IsNotNull(attribute); 
     Assert.AreEqual(1, attributes.Count()); 
     Assert.IsTrue(attributes.Contains(HttpVerbs.Post)); 
} 
+0

그래서 당신이 말하고있는 것은 테스트 반대로 당신이 있습니다 .. .Post 동사와 특정 컨트롤러 방법을 장식했는지 확인하기 위해 테스트하는 것입니다 그 이 메소드는 요청에 HTTP 요청이 발생했습니다 (이 범위 외부의 배관 방법 -> 프레임 워크의 내용) ..? –

+0

수정. 필터를 호출하는 기능은 메서드의 범위 밖에 있습니다 (메서드가 호출되기 전에 먼저 실행됩니다). 따라서 올바른 특성이 적용되면 메서드에서 비 POST를 결코 볼 수 없습니다. – tvanfosson

관련 문제