asp.net-mvc – 集成测试MVC应用程序,没有UI自动化的痛苦
| 
 我正在开发一个新的MVC应用程序,该应用程序将主要使用TDD编写.我想添加一些集成测试,以确保完全连线的应用程序(我正在使用StructureMap for IOC,NHibernate for persistence)按预期工作. 
  
  虽然我打算用Selenium编写一些功能性烟雾测试,但出于可维护性的原因,我宁愿通过使用旧的C#在我的控制器上直接调用操作来进行大部分集成测试. 关于如何实现这一目标的指导令人惊讶,因此我对攻击计划进行了抨击 >将所有引导代码从Global.asax中拉出并放入单独的类中 我已经完成了第1步,但实际上不知道如何继续第2步.任何指导都将不胜感激. public class Bootstrapper
{              
    public static void Bootstrap()
    {
        DependencyResolverInitializer.Initialize();
        FilterConfig.RegisterFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        ModelBinders.Binders.DefaultBinder = new SharpModelBinder();
    }           
}
public class DependencyResolverInitializer
{
    public static Container Initialize()
    {
        var container = new Container();
        container.Configure(x => x.Scan(y =>
        {
            y.Assembly(typeof(Webmin.UI.FilterConfig).Assembly);
            y.WithDefaultConventions();
            y.LookForRegistries();
        }));
        DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
        return container;
    }
}
public class StructureMapDependencyResolver : IDependencyResolver
{
    private readonly IContainer _container;
    public StructureMapDependencyResolver(IContainer container)
    {
        _container = container;
    }
    public object GetService(Type serviceType)
    {
        if (serviceType.IsAbstract || serviceType.IsInterface) {
            return _container.TryGetInstance(serviceType);
        }
        return _container.GetInstance(serviceType);
    }
    public IEnumerable<object> GetServices(Type serviceType)
    {
        return _container.GetAllInstances(serviceType).Cast<object>();
    }
}解决方法
 如果您希望在不通过UI的情况下对ASP.NET MVC应用程序进行自动端到端测试,那么一种好的方法是以编程方式将HTTP请求发送到不同的URL并在之后断言系统的状态. 
  
  您的集成测试基本上如下所示: >安排:启动Web服务器以托管正在测试的Web应用程序 您可以使用CassiniDev轻松地在进程内Web服务器中托管ASP.NET Web应用程序.此外,以编程方式发送HTTP请求的一种便捷方法是使用Microsoft ASP.NET Web API Client Libraries. 这是一个例子: [TestFixture]
public class When_retrieving_a_customer
{
    private CassiniDevServer server;
    private HttpClient client;
    [SetUp]        
    public void Init()
    {
        // Arrange
        server = new CassiniDevServer();
        server.StartServer("..relativepathtowebapp",80,"/","localhost");
        client = new HttpClient { BaseAddress = "http://localhost" };
    }
    [TearDown]
    public void Cleanup()
    {
        server.StopServer();
        server.Dispose();
    }
    [Test]
    public void Should_return_a_view_containing_the_specified_customer_id()
    {
        // Act
        var response = client.GetAsync("customers/123").Result;
        // Assert
        Assert.Contains("123",response.Content.ReadAsStringAsync().Result);
    }
}如果你正在寻找一个更完整的技术实例,你可以在我的sample MVC 4 web application中找到它,我在写作automated acceptance tests的背景下展示了它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 
- asp.net-mvc – ASP.NET MVC:正确的地方为部分视图?
- 在asp.net.mvc中,什么是正确的方法来引用css内的图像
- Asp.net MVC实现生成Excel并下载功能
- asp.net-mvc – 没有找到与名为“User”的控制器匹配的类型
- asp.net-mvc-routing – 获取错误的路由并且ActionLink生成
- asp.net – ValidateRequest = False但是在行动中它仍然是T
- asp.net-web-api – 在运行时禁用ApiController
- 如何知道asp.net 3.5 sp1和asp.net mvc是否安装在服务器中?
- asp.net-mvc – UserManager.AddPasswordAsync()返回“Name
- asp.net-mvc-2 – 什么是Html.Validate和Html.ValidateFor方
- asp.net-mvc – ActionLink MVC中的图像按钮
- asp.net-mvc – 更新用户声明不起作用.为什么?
- asp.net – MVC应用程序中的Aspx母版页
- asp.net-mvc – IIS 8 Express不提供页面
- asp.net-mvc – 加载登录表单时网站速度慢
- 代码翻译:ASP.NET Server.Transfer in PHP
- asp.net – 限制可以输入’textarea’的文本数量
- asp.net – 无法将“ASP._Page__ViewStart_cshtm
- Asp.NET Core+ABP框架+IdentityServer4+MySQL+Ex
- ASP.NET缩小并连接App_Themes CSS文件
