【发布时间】:2010-07-15 18:44:11
【问题描述】:
我开始使用 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 中的所有内容提取到辅助方法或 [Setup] 方法中,但如果我这样做,那么我将无法访问每个模拟服务来设置期望。
我在这里遗漏了什么,还是我真的必须在每个单元测试中复制并粘贴这块 Arrange 代码?
【问题讨论】:
标签: c# unit-testing asp.net-mvc-2 nunit moq