我使用Visual Studio 2010 SP1和程序包向导为扩展程序生成单元测试。单元测试通过,但集成测试(未修改)在使用NullReferenceException的UIThreadInvoker.Invoke调用时失败。我添加了一个菜单和一个工具窗口,其中包含向导中的复选框。
测试方法VSPackage2_IntegrationTests.IntegrationTests.CSharpProjectTests.WinformsApplication抛出异常: System.NullReferenceException:未将对象引用设置为对象的实例。 在f:\ dd \ VSSDK \ VSIntegration \ Tools \ src \ IDEHostAdapter \ Framework \ UIThreadInvoker.cs中的Microsoft.VSSDK.Tools.VsIdeTesting.UIThreadInvoker.Invoke(Delegate方法):第44行 在CSharpProjectTests.cs中的VSPackage2_IntegrationTests.IntegrationTests.CSharpProjectTests.WinformsApplication():第62行
using System;
using System.Text;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.VsSDK.IntegrationTestLibrary;
using Microsoft.VSSDK.Tools.VsIdeTesting;
namespace VSPackage2_IntegrationTests.IntegrationTests
{
[TestClass]
public class CSharpProjectTests
{
#region fields
private delegate void ThreadInvoker();
private TestContext _testContext;
#endregion
#region properties
/// <summary>
///Gets or sets the test context which provides
///information about and functionality for the current test run.
///</summary>
public TestContext TestContext
{
get { return _testContext; }
set { _testContext = value; }
}
#endregion
#region ctors
public CSharpProjectTests()
{
}
#endregion
#region Additional test attributes
//
// You can use the following additional attributes as you write your tests:
//
// Use ClassInitialize to run code before running the first test in the class
// [ClassInitialize()]
// public static void MyClassInitialize(TestContext testContext) { }
//
// Use ClassCleanup to run code after all tests in a class have run
// [ClassCleanup()]
// public static void MyClassCleanup() { }
//
// Use TestInitialize to run code before running each test
// [TestInitialize()]
// public void MyTestInitialize() { }
//
// Use TestCleanup to run code after each test has run
// [TestCleanup()]
// public void MyTestCleanup() { }
//
#endregion
[TestMethod]
[HostType("VS IDE")]
public void WinformsApplication()
{
UIThreadInvoker.Invoke((ThreadInvoker)delegate()
{
TestUtils testUtils = new TestUtils();
testUtils.CreateEmptySolution(TestContext.TestDir, "CSWinApp");
Assert.AreEqual<int>(0, testUtils.ProjectCount());
//Create Winforms application project
//TestUtils.CreateProjectFromTemplate("MyWindowsApp", "Windows Application", "CSharp", false);
//Assert.AreEqual<int>(1, TestUtils.ProjectCount());
//TODO Verify that we can debug launch the application
//TODO Set Break point and verify that will hit
//TODO Verify Adding new project item to project
});
}
}
}
UIThreadInvoker.cs没有任何来源可以查看null异常发生的位置...我必须在设置中做错了所以我重新安装SDK无济于事。我再次使用包向导进行双重检查,第二个解决方案得到相同的错误。我试过评论代表的全部和部分内容,但它仍然失败。所有其他集成测试也会在同一位置出现相同的错误。
编辑: 在进一步研究这个问题后,我将测试的初始部分修改为:
[TestMethod]
[HostType("VS IDE")]
public void PackageLoadTest()
{
UIThreadInvoker.Initialize();
UIThreadInvoker.Invoke((ThreadInvoker)OnThreadInvoker);
}
private void OnThreadInvoker()
{
TestUtils testUtils = new TestUtils();
testUtils.CreateEmptySolution(TestContext.TestDir, "CSWinApp");
....
}
在调试器中,它获取CreateEmptySolution方法,该方法最终使用VsIdeTestHostContext.ServiceProvider,该方法为null。实际上,VsIdeTestHostContext似乎未初始化。但是,我无法找到初始化它的方法。由于某种原因,VS IDE主机类型似乎没有启动,或者至少没有及时启动。
答案 0 :(得分:1)
关于您的编辑 - 来自“用于VS Team System的VS IDE主机适配器(示例)”的ReadMe.doc
如果是VsIdeTestHostContext.Dte或VsIdeTestHostContext.ServiceProvider 返回null,确保您的测试项目有引用 正确的版本 Microsoft.Samples.VisualStudio.TestTools.VsIdeTestHostFramework.dll。 如果您的项目引用了强签名,则可以为null 框架程序集的版本,但您已安装unsigned 框架程序集的版本。
答案 1 :(得分:0)
除了Omer Raviv的优秀暗示,我还有经验,我需要
将VSXI软件包的安装目标升级到当前使用的Visual Studio版本(在本例中为2015)
然后,它奏效了。