2010-07-15 5 views
5

저는 Moq 프레임 워크를 시작하고 절대적으로 좋아합니다. 필자는 테스트를 위해 컨트롤러를 준비 할 수있는 몇 가지 서비스와 인터페이스가있는 컨트롤러 테스트를 작성하고 있습니다. 나는 그것을 조금 더 모듈화하고 싶다. 그리고 이것이 사소한 일이라고 생각했지만, 생각했던 것보다 조금 더 까다로운 것으로 판명되었다. 내가 할 수 있도록하고 싶습니다 무엇반복 설정으로 Moq 컨트롤러 테스트

[Test] 
public void Get_SignIn_Should_Return_View() 
{ 
    #region //TODO: figure out how to extract this out to avoid duplicate code 
    // Arrange 
    var membershipService = new Mock<IMembershipService>(); 
    var formsService = new Mock<IFormsAuthenticationService>(); 
    var userService = new Mock<IUserService>(); 
    var dictService = new Mock<IDictionaryService>(); 
    var shoppingBasketService = new Mock<IShoppingBasketService>(); 

    //Create the service provider mock and pass in the IRepositoryFactory so that it isn't instantiating real repositories 
    var repoFactory = new Mock<IRepositoryFactory>(); 
    var serviceProvider = new Mock<ServiceProvider>((IRepositoryFactory)repoFactory.Object); 

    var context = new Mock<HttpContextBase> { DefaultValue = DefaultValue.Mock }; 
    var sessionVars = new Mock<SessionVars>(); 

    AccountController controller = new AccountController(serviceProvider.Object, sessionVars.Object) 
    { 
     FormsService = formsService.Object, 
     MembershipService = membershipService.Object, 
     UserService = userService.Object, 
     DictionaryService = dictService.Object, 
     ShoppingService = shoppingBasketService.Object 
    }; 
    controller.ControllerContext = new ControllerContext() 
    { 
     Controller = controller, 
     RequestContext = new RequestContext(context.Object, new RouteData()) 
    }; 
    #endregion 

    // Act 
    ActionResult result = controller.SignIn(); 

    // Assert 
    Assert.IsInstanceOf<ViewResult>(result); 
} 

#region 모든 것을 받아 도우미 메서드로 그를 추출하거나 수 있습니다 : 여기

내가 예를 보여 주어야 하나 개의 간단한 단위 테스트입니다 [설치] 방법,하지만 그렇게한다면, 각 모의 서비스에 대한 기대치를 설정할 수있는 권한이 없습니다.

여기에 누락 된 것이 있습니까? 아니면 각 단위 테스트에서이 코드 조각을 복사하여 붙여 넣기해야합니까?

답변

3

문맥을 사용하여 모든 모의 문을 설정 한 다음 문맥을 상속하는 test fixtures을 사용하십시오. 이 비품과 비올라에 시험을 넣어 라! 이 코드는 사용중인 프레임 워크에 맞지 않을 수 있습니다. 그것이 NUnit이면 그것은 될 것입니다. 그러나 이론은 거기에있다.

public abstract class MembershipTestContext 
    { 
     var membershipService = new Mock<IMembershipService>(); 
     var formsService = new Mock<IFormsAuthenticationService>(); 
     var userService = new Mock<IUserService>(); 
     var dictService = new Mock<IDictionaryService>(); 
     var shoppingBasketService = new Mock<IShoppingBasketService>(); 

     //Create the service provider mock and pass in the IRepositoryFactory so that it isn't instantiating real repositories 
     var repoFactory = new Mock<IRepositoryFactory>(); 
     var serviceProvider = new Mock<ServiceProvider>((IRepositoryFactory)repoFactory.Object); 

     var context = new Mock<HttpContextBase> { DefaultValue = DefaultValue.Mock }; 
     var sessionVars = new Mock<SessionVars>(); 

     [SetUp] 
     AccountController controller = new AccountController(serviceProvider.Object, sessionVars.Object) 
     { 
      FormsService = formsService.Object, 
      MembershipService = membershipService.Object, 
      UserService = userService.Object, 
      DictionaryService = dictService.Object, 
      ShoppingService = shoppingBasketService.Object 
     }; 
     controller.ControllerContext = new ControllerContext() 
     { 
      Controller = controller, 
      RequestContext = new RequestContext(context.Object, new RouteData()) 
     }; 
    } 

[TestFixture] 
public class when_getting_sign_in : MembershipContext 
{ 
    [Test] 
    public void Should_return_view() 
    { 
     // Act    
     ActionResult result = controller.SignIn(); 

     // Assert    
     Assert.IsInstanceOf<ViewResult>(result); 
    } 

    [Test] 
    public void Should_do_another_test() 
    { 
     ... another test etc 
    } 
} 
+0

그게 내가하는 일입니다. 기본 테스트 클래스의 모의 멤버를 만들고 그 테스트 메소드의 공통 설정 방법을 가지고 있습니다. –

1

당신이 할 수있는 한가지는 Mock.Get 메서드 (http://api.moq.me/html/C6B12927.htm)를 사용하여 주어진 객체 인스턴스의 모의 객체를 검색하는 것입니다.
또 다른 옵션은 코드를 리팩토링하고 테스트 클래스의 인스턴스 변수 (모의 테스트 클래스의 모든 테스트가 필요하다면) 또는 간단한 데이터 구조 (일부 테스트 만 그들을 요구할 것이다).

+0

와우, 나는 이것에 대해 몰랐습니다. 나중에 나를 위해 뭔가 도움이 될 것이라고 확신합니다. –