vs2008 UnitTesting- 사무실 응용 프로그램 개체 (PowerPoint 등)가있는 분리 된 RCW
-
12-09-2019 - |
문제
배경
- C#을 통해 PowerPoint 2007을 자동화하고 있습니다.
- 내 코드에 대한 Visual Studio (Microsoft.visualstudio.testTools.Unittesting)의 내장 단위 테스트를 사용하여 UnitTests를 작성하고 있습니다.
- 나는 사무실 2007 앱을 자동화하는 데 상대적으로 경험이 풍부합니다.
내 문제
- 단위 테스트를 실행하면 첫 번째 단위 테스트 방법이 잘 실행됩니다. 그 후 분리 된 RCW에 대한 오류가 있습니다.
- 테스트 방법을 공유 할 수있는 정적 인 인스턴스를 만들고 있지만 첫 번째 테스트 방법이 실행 된 후 RCW가 분리되는 것처럼 보입니다.
소스 코드
using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace TestDemo
{
[TestClass]
public class UnitTest1
{
private static Microsoft.Office.Interop.PowerPoint.ApplicationClass
g_app = new Microsoft.Office.Interop.PowerPoint.ApplicationClass();
private TestContext testContextInstance;
public TestContext TestContext
{
get
{
return testContextInstance;
}
set
{
testContextInstance = value;
}
}
[TestMethod]
public void Test01()
{
g_app.Visible = Microsoft.Office.Core.MsoTriState.msoCTrue;
}
[TestMethod]
public void Test02()
{
g_app.Visible = Microsoft.Office.Core.MsoTriState.msoCTrue;
}
}
}
오류 메시지
Test method TestDemo.UnitTest1.Test02 threw exception:
System.Runtime.InteropServices.InvalidComObjectException: COM
object that has been separated from its underlying RCW cannot be used..
이 메시지는 PowerPoint 인스턴스가 사용되는 줄에 제공됩니다 (가시 속성을 설정할 때)
내가 시도한 것
- UnitTests의 순서는 동작을 변경하지 않습니다.
- Word 2007, Visio 2007 등과 동일한 문제가 발생합니다.
- Nunit으로 테스트 케이스를 작성할 때 나는 이러한 문제를 얻지 못합니다. 분명히 비주얼 스튜디오가 단위 테스트를 실행하는 방법에 대해서는 분명히 다른 것입니다 (vs를 의미하지는 않지만 Nunit과 다릅니다).
- 눈에 보이는 속성과는 아무런 관련이 없습니다. 방법이나 속성의 사용 이이 문제를 일으킬 것입니다.
- 나는 인스턴스를 만들기 위해 Assemblesyinitialize 및 분류 성분을 사용하려고 시도했지만 아무것도 작동하지 않았습니다.
- Googled & Binged- 나를 돕는 명확한 대답 없음
코멘트
- 나는 Nunit으로 전환 할 수 있지만 Visual Studio의 기본 유닛 테스트 프레임 워크를 계속 사용하는 것을 선호합니다.
내 질문
- 모든 테스트 메드 중에서 공유 될 PowerPoint 2007의 단일 인스턴스를 성공적으로 만들 수 있습니까?
- 통찰력을 제공 할 수 있다면 왜 이런 일이 일어나고 있습니다. 감사 할 것입니다.
해결 된 (알코자 덕분에)
- 나는 그의 조언을 따라 .testrunconfig를 수정하고 효과가 있었다.
연결
해결책
문제는 MS 장치 테스트가 여러 스레드에서 실행되는 반면 Nunit 테스트는 동일한 스레드에서 실행됩니다. 그래서 MS 테스트에서 실행할 때 PowerPoint에 대한 정적 참조는 다음과 같습니다. 스레드간에 공유되고 있습니다, Com은 기본적으로 STA (단일 스레드) 이후로 마음에 들지 않습니다. MS 테스트를 전환하여 다음을 추가하여 MTA (COM 용 멀티 스레딩)를 사용할 수 있습니다.
<ExecutionThread apartmentState="MTA" />
*.testrunconfig 파일에 (파일을 XML로 열고 위의 줄을 chuck합니다. 메인 어디에서나 TestRunConfiguration
마디).
PowerPoint (& 귀하의 특정 테스트)가 멀티 스레드로 취급되는 것을 얼마나 잘 처리할지 확실하지 않지만 위의 사소한 예는 MTA를 켜고 통과합니다. 스레딩 문제가 발생하면 단위 테스트 주문 & 그것이 문제를 해결하는지 확인하십시오.
제휴하지 않습니다 StackOverflow