使用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;
}
}
}
答案 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)
我注意到您实施的某些类型(特别是IIdentity
和IPrincipal
)不在System.Web.*
程序集中。
您是否尝试将System.Security.Principal
程序集标记为“复制本地”?
答案 6 :(得分:0)
这让我想起了我曾读过的一篇旧帖子。也许您可以使用相同的技术来调试错误原因:
http://www.agileprogrammer.com/oneagilecoder/archive/2007/11/17.aspx