我将解决方案从VS2008转换为VS2010 SP1,并将单元测试项目更改为针对3.5框架。除了必须在单元测试项目中修复一些引用之外,一切正常,并且解决方案已成功构建。大多数测试都成功运行,但有一些测试失败了。失败的是使用私人访问者。就个人而言,我宁愿删除这些测试,因为我认为它们不是必需的,但只要它揭示了SP1中的一个潜在错误,我想我会看到是否有人能找到解决办法。 / p>
运行测试时收到的错误消息是“此程序集由比当前加载的运行时更新的运行时构建,无法加载。” 据我所知,私有访问器程序集似乎是由4.0运行时构建的(很可能是通过Microsoft.VisualStudio.QualityTools.UnitTestFramework),但由于MSTest加载了3.5运行时,因此会发生错误。 / p>
我尝试将Microsoft.VisualStudio.QualityTools.UnitTestFramework的引用更改为专门使用版本9.0(目前为10.1)。这会导致编译时错误,该错误表明私有访问器程序集使用的是Microsoft.VisualStudio.QualityTools.UnitTestFramework 10.0版本,该版本高于9.0版。
我删除了生成的私有访问器程序集并重新创建它,但仍然存在同样的问题。当3.5框架作为单元测试项目的目标时,似乎某些东西与VS2010 SP1不同步。
以下是其中一个单元测试的代码(同样,这不是一个非常有价值的测试,但这不是帖子的重点......):
[TestMethod()]
public void GetNullableCharValue_DBNull_ReturnsNull_Test()
{
object value = DBNull.Value;
Nullable<char> expected = null;
Nullable<char> actual;
actual = RepositoryBase_Accessor.GetNullableCharValue(value);
Assert.AreEqual(expected, actual);
}
答案 0 :(得分:3)
我也遇到了这个问题。 Visual Studio 2010 SP1添加了对基于.NET v3.5的单元测试项目的支持;之前的单元测试被迫使用.NET4。
关于这个主题有一个Microsoft Connect bug,但是我刚写完这个答案的那天就已经提交了,所以微软还没有做出有意义的回复。
我选择的解决方法是使用Visual Studio 2008工具链手动生成私有访问器程序集,并从单元测试项目中添加对它的手动引用。
步骤如下:
1)从单元测试 .csproj 文件中删除自动生成的访问器:
<ItemGroup>
<Shadow Include="Test References\Assembly.accessor" />
</ItemGroup>
2)使用Publicize VS2008创建v3.5兼容的访问器程序集:
"%VS90COMNTOOLS%vsvars32.bat"
publicize Assembly.dll
3)将程序集复制到源树文件夹,例如在文件夹Accessors
下:
copy Assembly_Accessor.dll ProjectDir\Accessors\Assembly_Accessors.dll
4)使用Visual Studio界面添加访问器程序集作为单元测试项目的参考:
Project -> Add Reference.. -> Browse...
5)使用 Ctrl + Shift + B 构建解决方案并运行测试。
您现在可以签入生成的程序集,也可以在预构建事件中自动创建它。
答案 1 :(得分:1)
当对程序集进行签名和版本控制或存在访问者类时,此解决方案不起作用。
答案 2 :(得分:0)