代码之家  ›  专栏  ›  技术社区  ›  Dean Taylor

MvcIntegrationTestFramework或为ASP.NET MVC 3更新的替代方案

  •  18
  • Dean Taylor  · 技术社区  · 14 年前

    我有兴趣用史蒂夫·桑德森 MvcIntegrationTestFramework 或者类似的选择 使用ASP.NET MVC 3测试版。

    当前正在编译 MVC集成测试框架 针对MVC 3测试版,由于MVC中的更改,我得到以下错误:

    Error 6 'System.Web.Mvc.ActionDescriptor.GetFilters()' is obsolete: '"Please call System.Web.Mvc.FilterProviders.Providers.GetFilters() now."' \MvcIntegrationTestFramework\Interception\InterceptionFilterActionDescriptor.cs Line 18

    问题

    一。有谁能提供为ASP.netmvc3beta工作的MvcIntegrationTestFramework吗?

    ---和/或---

    2。你会推荐类似的选择吗?


    编辑1: 注意:我已经给MvcIntegrationTestFramework的创建者Steve发了电子邮件,希望能得到一些反馈。

    编辑2和3: 我收到史蒂夫的来信。报价供参考:
    我不需要在MVC 3中使用这个项目,所以很抱歉,我没有它的更新版本。据我所知,应该可以将其更新为在MVC3上工作,但您可能需要通过检查MVC3源代码来了解这一点,以注意现在如何调用操作、过滤器等的任何更改。如果你真的更新了它,如果你决定把它作为一个正在进行的项目(例如,把它放在Github上或类似的项目),让我知道,我会发布一个链接到它! (谢谢史蒂夫!)

    编辑4: 真的很快就用上了 System.Web.Mvc.FilterProviders.Providers.GetFilters() 没有得到任何快速和简单地添加 [Obsolete] 发现MVC请求的内部存在错误。还有人涉猎过吗?

    编辑5: 如果您正在使用MVC 3的替代集成测试框架,请发表评论。

    4 回复  |  直到 14 年前
        1
  •  9
  •   Jon Canning    13 年前
        2
  •  4
  •   Francis Shanahan    14 年前

    我意识到这并不是您要寻找的答案,但是Selenium或Watin可能会作为集成测试框架的替代品对您有用。

    硒会让您记录测试为NUngEnter代码,这样您就可以与现有的测试项目集成。然后,您的测试可以类似于集成测试框架来验证DOM。其优点是Selenium测试可以在不同的浏览器上执行。

    关键的警告是Selenium需要将你的应用程序部署在web服务器上,不确定这是否是你的展示障碍。

        3
  •  1
  •   sammy34    12 年前

    我想我会分享我的使用经验 MVC集成测试框架 在ASP.NET MVC4项目中。特别是,ASP.NET MVC 4项目 Microsoft Azure云服务的Web角色 .

    尽管Jon Canning的fork中的示例项目对我有效(尽管我确实将System.Web.Mvc程序集从3.0.0.0更改为4.0.0.0,这需要在Web.config文件中进行大量编辑才能运行并通过测试),但每当我尝试对Azure ASP.NET Mvc 4 Web角色项目运行相同的测试时,都会出现错误。错误是:

    System.Reflection.TargetInvocationException:调用的目标引发了异常。

    内部异常是:

    System.InvalidOperationException:在应用程序的启动前初始化阶段无法调用此方法。

    我开始想知道基于ASP.NET MVC 4的Azure Web角色项目与普通的ASP.netmvc4项目有何不同,以及这种差异将如何导致此错误。我在网上做了一些搜索,但没有发现有人试图做和我一样的事情。很快我意识到这和 Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener . 这个类的部分角色似乎是确保web角色 在托管服务或开发结构中运行 (如果将启动项目从云服务项目切换到云服务解决方案中的web角色项目,然后尝试调试,则会看到一条这样的消息)。

    这个 解决方案 ? 我从Web角色项目的Web.config文件中删除了相应的侦听器:

    <configuration>
    ... 
      <system.diagnostics>
        <trace>
          <listeners>
            <!--Remove this next 'add' element-->
            <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
          name="AzureDiagnostics"> <filter type="" /> </add> 
          </listeners>
        </trace>
      </system.diagnostics>
    ...
    </configuration>
    

    然后,我可以正常地对我的Web角色项目运行集成测试。不过,我确实将侦听器添加到Web.Debug.config和Web.Release.config转换文件中,以便在正常部署和调试时一切都保持不变。

    或许这将有助于那些希望使用MvcIntegrationTestFramework进行Azure开发的人。

    编辑 我刚刚意识到,这个解决方案可能有点“黑客”,因为它可能不允许您对与Azure组件相关的应用程序代码进行集成测试(例如,可能是特殊的Azure缓存机制)。也就是说,我还没有遇到与此相关的任何问题,尽管我也没有真正编写过那么多集成测试。。。

        4
  •  0
  •   Heskja    12 年前

    我用了乔恩·坎宁的最新版本( https://github.com/JonCanning/MvcIntegrationTestFramework/ )它很好地解决了我的问题,控制器方法只接受值类型和字符串,而不接受类。

    结果发现更新的 MvcIntegrationTestFramework .

    我知道如何修复它,但不知道该在哪里发布解决方案,所以这里是:

    显示其工作原理的简单示例是:

        [TestMethod]
        public void Account_LogOn_Post_Succeeds()
        {
            string loginUrl = "/Account/LogOn";
            appHost.Start(browsingSession =>
            {
                var formData = new RouteValueDictionary
                {
                    { "UserName", "myusername" },
                    { "Password", "mypassword" },
                    { "RememberMe", "true"},
                    { "returnUrl", "/myreturnurl"},
                };
    
                RequestResult loginResult = browsingSession.Post(loginUrl, formData);
    
                // Add your test assertions here.
            });
        }
    

    对…的呼唤 browsingSession.Post 最终会导致 NameValueCollectionConversions.ConvertFromRouteValueDictionary(object anonymous) 要调用的方法,其代码为:

    public static class NameValueCollectionConversions
    {
        public static NameValueCollection ConvertFromObject(object anonymous)
        {
            var nvc = new NameValueCollection();
            var dict = new RouteValueDictionary(anonymous); // ** Problem 1
    
            foreach (var kvp in dict)
            {
                if (kvp.Value == null)
                {
                    throw new NullReferenceException(kvp.Key);
                }
                if (kvp.Value.GetType().Name.Contains("Anonymous"))
                {
                    var prefix = kvp.Key + ".";
                    foreach (var innerkvp in new RouteValueDictionary(kvp.Value))
                    {
                        nvc.Add(prefix + innerkvp.Key, innerkvp.Value.ToString());
                    }
                }
                else
                {
                    nvc.Add(kvp.Key, kvp.Value.ToString()); // ** Problem2
                }
            }
            return nvc;
        }
    

    然后有两个问题:

    1. 对…的呼唤 new RouteValueDictionary(anonymous) 会导致“新的” RouteValueDictionary 要创建,但不是4个键,只有3个,其中一个是4个项的数组。
    2. 当它碰到这条线时: nvc.Add(kvp.Key, kvp.Value.ToString() ,和 kvp.Value 是一个数组,ToString()给出: "System.Collections.Generic.Dictionary'2+ValueCollection[System.String,System.Object]"

    解决方法(针对我的特定问题)是按如下方式更改代码:

            var dict = anonymous as RouteValueDictionary; // creates it properly
            if (null == dict)
            {
                dict = new RouteValueDictionary(anonymous);             
            }
    

    在我做了这个更改之后,我的模型类将正确绑定,一切都会好起来的。