如果使用私有访问器,针对3.5框架的VS2010 SP1单元测试会失败

4
我将一个解决方案从VS2008转换到了VS2010 SP1,并将单元测试项目更改为目标框架3.5。除了需要在单元测试项目中修复一些引用之外,一切都正常,解决方案成功构建。大多数测试都成功运行,但有几个失败了。失败的那些使用了私有访问器。就我个人而言,我宁愿删除这些测试,因为我认为它们并不必要,但只要它能揭示SP1中的潜在错误,我想看看是否有人能找出解决方法。
运行测试时收到的错误消息是“此程序集是由当前加载的运行时更新的运行时构建的,无法加载。”据我所知,似乎是私有访问器程序集是由4.0运行时构建的(最可能是通过Microsoft.VisualStudio.QualityTools.UnitTestFramework),但由于MSTest加载了3.5运行时,导致出现了错误。
我尝试更改对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);
    }
3个回答

3
我也遇到了这个问题。Visual Studio 2010 SP1支持基于.NET v3.5的单元测试项目;之前,单元测试必须使用.NET4。
此主题有一个Microsoft Connect bug,但是在我撰写答案的当天才提交,因此Microsoft尚未做出有意义的回应。
我选择的解决方法是使用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 构建您的解决方案并运行测试。

现在,您可以检查生成的程序集,或在预构建事件中自动创建它。


有没有可以下载VS 2008的publicize.exe的地方?链接页面上没有下载按钮,而且我在谷歌上搜索也没有结果。 - LCC


0

一切似乎都设置正确了。问题似乎特定于私有访问器。 - Dominick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接