Mas*_*ase 5 c# nunit unit-testing moq asp.net-mvc-2
我开始使用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 );
}
Run Code Online (Sandbox Code Playgroud)
我希望能够做的是将所有内容都#region提取到辅助方法或[Setup]方法中,但如果我这样做,那么我就无法访问每个模拟服务来设置期望.
有没有我在这里缺少的东西,或者我真的必须在每个单元测试中复制并粘贴这一排编码?
尝试使用上下文来设置所有模拟,然后使用继承上下文的测试装置。将测试放入这些装置和 viol\xc3\xa0! 此代码可能不完全适合您正在使用的框架。如果是 NUnit 那就会了。但理论就在那里。
\n\npublic abstract class MembershipTestContext\n {\n var membershipService = new Mock<IMembershipService>();\n var formsService = new Mock<IFormsAuthenticationService>();\n var userService = new Mock<IUserService>();\n var dictService = new Mock<IDictionaryService>();\n var shoppingBasketService = new Mock<IShoppingBasketService>(); \n\n //Create the service provider mock and pass in the IRepositoryFactory so that it isn\'t instantiating real repositories \n var repoFactory = new Mock<IRepositoryFactory>(); \n var serviceProvider = new Mock<ServiceProvider>( (IRepositoryFactory)repoFactory.Object ); \n\n var context = new Mock<HttpContextBase> { DefaultValue = DefaultValue.Mock }; \n var sessionVars = new Mock<SessionVars>(); \n\n [SetUp]\n AccountController controller = new AccountController( serviceProvider.Object, sessionVars.Object ) \n { \n FormsService = formsService.Object, \n MembershipService = membershipService.Object, \n UserService = userService.Object, \n DictionaryService = dictService.Object, \n ShoppingService = shoppingBasketService.Object \n }; \n controller.ControllerContext = new ControllerContext() \n { \n Controller = controller, \n RequestContext = new RequestContext( context.Object, new RouteData() ) \n }; \n }\n\n[TestFixture]\npublic class when_getting_sign_in : MembershipContext\n{\n [Test]\n public void Should_return_view()\n {\n // Act \n ActionResult result = controller.SignIn();\n\n // Assert \n Assert.IsInstanceOf<ViewResult>(result);\n }\n\n [Test]\n public void Should_do_another_test()\n {\n ... another test etc\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1016 次 |
| 最近记录: |