单元测试适配器抛出异常:无法在ASP.NET MVC中加载一个或多个....

时间:2009-04-09 07:05:56

标签: asp.net-mvc

使用ASP.NET MVC 1.0(当前版本)我在x64计算机(Server 2008)上使用Visual Studio 2008创建一个新的默认ASP.NET MVC项目,并接受所有默认值并构建并运行它。除了必须将System.Web。*程序集设置为“复制本地”之外,它还会运行并启动默认的Web应用程序。当我尝试在这个项目上运行单元测试时,我得到:

单元测试适配器引发异常:无法加载一个或多个请求的类型。检索LoaderExceptions属性以获取更多信息..

现在,如果我在x86机器(Server 2003)上使用VS2008重复相同的练习,那么所有27个默认单元测试运行正常。 (另外,我不需要将System.Web。*程序集标记为“Copy Local”)

解决异常的想法?

更多信息: 在尝试了一些建议的解决方案之后,我开始评论用新项目生成的样板测试代码的部分内容。因此,我认为错误是通过包含以下类之一产生的:

    public class MockIdentity : IIdentity
    {
        public string AuthenticationType
        {
            get
            {
                return "MockAuthentication";
            }
        }

        public bool IsAuthenticated
        {
            get
            {
                return true;
            }
        }

        public string Name
        {
            get
            {
                return "someUser";
            }
        }
    }

    public class MockPrincipal : IPrincipal
    {
        IIdentity _identity;

        public IIdentity Identity
        {
            get
            {
                if (_identity == null)
                {
                    _identity = new MockIdentity();
                }
                return _identity;
            }
        }

        public bool IsInRole(string role)
        {
            return false;
        }
    }

    public class MockMembershipUser : MembershipUser
    {
        public override bool ChangePassword(string oldPassword, string newPassword)
        {
            return newPassword.Equals("newPass");
        }
    }

    public class MockHttpContext : HttpContextBase
    {
        private IPrincipal _user;

        public override IPrincipal User
        {
            get
            {
                if (_user == null)
                {
                    _user = new MockPrincipal();
                }
                return _user;
            }
            set
            {
                _user = value;
            }
        }
    }

7 个答案:

答案 0 :(得分:3)

首先,您是否在发布配置中尝试过它?你有没有完成你的解决方案?

您是否尝试构建测试项目?取出测试的源文件,从解决方案中删除项目并添加一个引用MVC应用程序的新测试项目。然后重新添加测试源文件。

修改

您正在测试中使用和实现的类和接口是什么?

修改 它是引用x64而不是x86 dll吗?

答案 1 :(得分:1)

您的Win2k8盒中是否安装了VS 2008 SP1和.NET 3.5 SP1?默认情况下VS 2008安装了3.5框架,但不是SP1。确保安装了框架SP1和VS 2008 SP1。

答案 2 :(得分:1)

您是否尝试在x64计算机上将项目构建为x86项目(项目属性 - >构建 - >平台目标)?

另外,不确定您的单元测试工具包,但是NUnit可以作为x86或x64(在x64机器上)的测试运行。如果其中一个程序集访问某些32位代码(例如COM对象),则尝试在x64下运行它们将导致“无法加载一个或多个请求的类型”错误。

答案 3 :(得分:1)

我不确定x64 verus x86的细微之处,但使用自定义标识/主体可能会导致一些有趣的小问题,特别是如果使用cassini(内置的vshost网络服务器 - 我想想你最终在VS中运行本地单元测试。我之前遇到过这个问题,而不是在这里详细说明,我会发布一些信息的链接。同样,我不确定这是否与您的问题有关(我不是MVC大师),但请仔细阅读。值得深思:

http://www.lhotka.net/weblog/UpdateOnMyStrugglesWithTheASPNETDevelopmentServer.aspx

编辑:最终,这可能是序列化失败的问题,即使这个特殊的边缘情况不相关。您是否尝试将您的模拟iidentity / iprincpal对象标记为[可序列化]?请记住,visual studio是一个32位应用程序;也许在IIS(如果不是cassini)上用64位应用程序池测试它会导致某个地方的上下文切换导致模拟身份(如果它们被分配为线程的身份)被编组跨越这样的边界 - 缺少[

如果将IIS设置为使用32位应用程序池(在64位服务器上),它是否仍会抛出?

-Oisin

答案 4 :(得分:0)

我想知道更重要的差异是2k8 vs 2k3还是64 vs 32bit。您是否以管理员身份生成Visual Studio?由于Windows 2k8的虚拟存储,可能会丢失程序集。如果这是运行2k8的开发桌面,您可能需要考虑禁用虚拟存储,它在您的策略中标记为“用户帐户控制:虚拟化文件和注册表写入每个用户位置的失败”

答案 5 :(得分:0)

我注意到您实施的某些类型(特别是IIdentityIPrincipal)不在System.Web.*程序集中。

您是否尝试将System.Security.Principal程序集标记为“复制本地”?

答案 6 :(得分:0)

这让我想起了我曾读过的一篇旧帖子。也许您可以使用相同的技术来调试错误原因:

http://www.agileprogrammer.com/oneagilecoder/archive/2007/11/17.aspx