“Method ...ClassInitialize has wrong signature ...”是什么意思?

23
在我的Visual Studio 2012解决方案中,我有一个用于对C++/CLI代码进行单元测试的C#项目。例如:
...
using System.IO;
using Stuff;

namespace MyCLIClassTest
{
    [TestClass]
    public class MyCLIClassTest
    {
        public MyCLIClassTest() {}

        [ClassInitialize]
        public static void Setup(TestContext testContext) 
        {
        }

        [TestMethod]
        public void LibraryAccessTest()
        {
            ...
        }
    }
}

现在,所有的 C# 测试都失败了并显示一条消息,例如 "Method MyCLIClassTest.MyCLIClassTest.ClassInitialize has wrong signature. The method must be static, public, does not return a value and should take a single parameter of type TestContext."。

在移除 ClassInitializer 后,我得到了 "Unable to set TestContext property for the class MyCLIClassTest.MyCLIClassTest. Error: System.ArgumentException: Object of type 'Microsoft.VisualStudio.TestPlatform.MSTestFramework.TestContextImplementation' cannot be converted to type 'Microsoft.VisualStudio.TestTools.UnitTesting.TestContext'.."


一切看起来对我来说都很好。当你排除C++测试时会发生什么?你能把它们从项目中暂时排除掉,看看C#会发生什么吗? - nikita
1
这里仍然没有看到任何可疑的东西。请注释 [ClassInitialize] 方法。两个 [ClassInitialize] 方法? - nikita
好的,明白了。在移除了ClassInitializer后,我得到了这个错误信息:"无法为类MyCLIClassTest.MyCLIClassTest设置TestContext属性。 错误:System.ArgumentException: 无法将类型为'Microsoft.VisualStudio.TestPlatform.MSTestFramework.TestContextImplementation'的对象转换为类型'Microsoft.VisualStudio.TestTools.UnitTesting.TestContext'。"。而且这与引用有关。我仍然使用旧框架版本的DLL文件。 - TobiMcNamobi
可能是[为什么ClassInitialize装饰的方法会导致所有测试失败?]的重复问题。(https://dev59.com/-mXWa4cB1Zd3GeqPO6W3) - Zain Rizvi
@TobiMcNamobi 啊,抱歉,没有注意到TestContext参数。撤回关闭投票。 - Zain Rizvi
显示剩余2条评论
4个回答

26

我使用了旧版的单元测试框架DLL。这是因为该项目最近迁移到了VS2012。

所以,在解决方案资源管理器中,找到测试项目下的“引用”。右键单击它,然后选择“添加引用…”以打开引用管理器。搜索“unittest”,并勾选版本号为10.1.0.0的Microsoft.VisualStudio.QualityTools.UnitTestFramework程序集。取消勾选此程序集的所有其他版本。通过点击“确定”关闭管理器。

输入图像描述


我在Visual Studio 2013中的一个全新的单元测试类库中遇到了同样的问题。这个解决方案对我很有帮助。 - Daniel
1
也发生在我身上。该项目引用了UnitTestFramework 10.0.0.0版本。VS2012没有这个版本,所以决定降级到9.0.0.0版本。将它改回10.1.0.0版本解决了问题。 - savagepanda
@JeremyThompson 谢谢您添加这个说明性图片。 - TobiMcNamobi

16

3
正如您在上面的问题中所看到的,ClassInitialize修饰的方法已经是public static void,测试类中唯一的,并且需要一个TestContext参数。这两个问题有两个不同的答案。感谢提供参考。 - TobiMcNamobi

1

安装程序签名错误。参数1应为Microsoft.VisualStudio.TestTools.UnitTesting.TestContext类型。

我正在运行一个负载测试项目,并且同时具有DLL的v10.0.0.0版本:

Microsoft.VisualStudio.QualityTools.LoadTestFramework.dll
Microsoft.VisualStudio.QualityTools.WebTestFramework.dll

将LoadTestFramework版本更改为10.1并没有解决问题。

我不得不前往我的单元测试项目并删除MSTest.Adapter引用:

Microsoft.VisualStudio.TestPlatform.TestFramework.dll
Microsoft.VisualStudio.TestPlatform.Extensions.dll

然后在单元测试项目中添加对v10.1的引用。

Microsoft.VisualStudio.QualityTools.LoadTestFramework.dll

1
我遇到了完全相同的问题,按照TobiMcNamobi建议的移除/添加引用并未解决我的问题,但是移除引用,右键单击项目并选择“添加>单元测试…”,这样重新生成引用就可以解决问题。不确定与手动操作有何不同。

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