2013-08-06 1 views
4

ReSharper 용 xunit.net 테스트 러너를 작성하고 8.0 릴리스에서 문제가 발생했습니다. 섀도 복사 된 AppDomain에서 어셈블리를로드하지 못하고 있습니다. 동일한 코드 및 테스트 프로젝트가 7.1 릴리스에서 올바르게 작동합니다. 나는 왜 그런지 이해하지 못한다.섀도 복사 된 AppDomain에로드하지 못했습니다.

테스트를 실행하면 ReSharper가 내 플러그인을로드하는 실행 파일을 생성합니다. xunit.net의 API를 사용하여 쉐도우 복사본이 활성화 된 AppDomain을 만듭니다. 테스트 프로젝트 어셈블리가 섀도 복사본 캐시에 복사되고로드가 시작됩니다. FakeItEasy의 이전 버전 인 Assembly.LoadFile을 사용하여 현재 디렉터리의 모든 어셈블리 (테스트 프로젝트의 bin \ Debug 폴더)를로드합니다.이 테스트는 캐시에 종속성을 복사하고로드합니다. 따라서 FakeItEasy는 이러한 어셈블리를로드 컨텍스트에로드하지 않습니다. LoadFile을 사용하기 때문에 섀도 복사본 캐시를 무시하고 파일은 bin \ Debug 폴더에서 직접로드됩니다.

그런 다음 테스트 프로젝트의 종속성이로드되지 않아 FileNotFoundException이 발생합니다. 퓨전 바인딩 로그는로드하려고 시도하지만 섀도 복사본 캐시에 복사되지 않고로드되지 않습니다. 나는 이유를 알 수 없다.

LOG: This bind starts in default load context. 
LOG: No application configuration file found. 
LOG: Using host configuration file: 
LOG: Using machine configuration file from  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config. 
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). 
LOG: Attempting download of new URL file:///C:/temp/todonancy/TodoNancyTests/bin/Debug/Nancy.Testing.DLL. 
LOG: Assembly download was successful. Attempting setup of file: C:\temp\todonancy\TodoNancyTests\bin\Debug\Nancy.Testing.dll 
LOG: Entering download cache setup phase. 
LOG: Assembly Name is: Nancy.Testing, Version=0.17.1.0, Culture=neutral, PublicKeyToken=null 
ERR: Setup failed with hr = 0x80070003. 
ERR: Failed to complete setup of assembly (hr = 0x80070003). Probing terminated. 

내가 섀도 복사본 캐시를 비활성화하거나, LoadFile과 같은 지시어, 모든 작품을 사용하지 않는 FakeItEasy의 최신 버전을 사용하는 경우 : 여기에 바인딩 실패입니다. 그러나 FakeItEasy의 이전 버전을 비난 할 수는 없습니다. 사용자가 다른 프로젝트 및 어셈블리와 동일한 오류를보고 섀도 복사본 캐시를 비활성화하여 해결할 수 있습니다.

또한이 시나리오는 동일한 플러그인 코드와 동일한 테스트 프로젝트 인 ReSharper 7.1에서도 작동합니다. 유일한 차이점은 호스트 응용 프로그램이지만 다른 작업을 수행하는 것을 볼 수 없습니다. 예를 들어 가입 된 다른 어셈블리 해결 이벤트 처리기가 없습니다. 유일한 차이점은 7.1 호스트가 Visual Studio 응용 프로그램과의 원격 통신을 사용하고 8.0은 간단한 TCP 소켓을 사용한다는 것입니다.

8.0 버전에서는 실패한 이유는 무엇입니까?

EDIT (2013년 7월 8일는) 다음과 함께 (A copy of the Nancy class 바로 프로젝트에 추가 사용

[Fact] 
public void Thing() 
{ 
    Assert.NotNull(Nancy.Bootstrapper.AppDomainAssemblyTypeScanner.Assemblies); 
} 

:

나는 간단한 테스트를 실패하게 관리했습니다 ScanModeAssemblyExtensions 클래스 참조). 프로젝트의 유일한 다른 내용은 xunit.dll 및 xunit.extensions.dll에 대한 참조입니다.

그것은 절망적 단속의 모든 시간을 실패하지 않습니다,하지만 난 bin \ debug 폴더에서 테스트 어셈블리를로드하는 동안이 this call to Assembly.ReflectionOnlyLoadFromFileNotFoundException을 던질 수 있습니다. // URL이 유효하고, 섀도 복사본 캐시는 xunit.dll 및 WeirdXunitFailures.DLL을합니다 (포함 : - : 여기

예외의 융합 로그의 파일을 불행하게도

Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll 
Running under executable C:\Program Files (x86)\JetBrains\ReSharper\v8.0\Bin\JetBrains.ReSharper.TaskRunner.CLR4.MSIL.exe 
--- A detailed error log follows. 

=== Pre-bind state information === 
LOG: Where-ref bind. Location = C:\Users\Matt\Code\scratch\WeirdXunitFailures\WeirdXunitFailures\bin\Debug\WeirdXunitFailures.dll 
LOG: Appbase = file:///C:/Users/Matt/Code/scratch/WeirdXunitFailures/WeirdXunitFailures/bin/Debug 
LOG: Initial PrivatePath = NULL 
Calling assembly : (Unknown). 
=== 
LOG: This is an inspection only bind. 
LOG: No application configuration file found. 
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config. 
LOG: Attempting download of new URL file:///C:/Users/Matt/Code/scratch/WeirdXunitFailures/WeirdXunitFailures/bin/Debug/WeirdXunitFailures.dll. 
ERR: Failed to complete setup of assembly (hr = 0x80070003). Probing terminated. 

이 나에게 아무것도 알려줍니다 테스트 프로젝트). 또한 디버거의 모듈 창에서 WeitdXunitFailures.dll이 이미 섀도 복사본 캐시 위치에서로드되었음을 보여줍니다.

또 다시, 정말로 이상한 점은 7.1 주자가 잘 작동한다는 것입니다.

편집 :

사실, 나는 그것이 호출하여 단순히 실패를 얻을 수 있습니다 :

[Fact] 
public void Thing() 
{ 
    Assembly.ReflectionOnlyLoadFrom(@"C:\Users\Matt\Code\scratch\WeirdXunitFailures\WeirdXunitFailures\bin\Debug\xunit.dll"); 
    Assembly.ReflectionOnlyLoadFrom(@"C:\Users\Matt\Code\scratch\WeirdXunitFailures\WeirdXunitFailures\bin\Debug\xunit.extensions.dll"); 
    Assembly.ReflectionOnlyLoadFrom(@"C:\Users\Matt\Code\scratch\WeirdXunitFailures\WeirdXunitFailures\bin\Debug\WeirdXunitFailures.dll"); 
} 

다음은 프로젝트 DLL 두 xUnit의 DLL이 있습니다. 그것은 여전히 ​​매우 간헐적이지만, 여러 번 성공적으로 실행 한 후에도 발생하지만 완전하게 재구성 한 후에 가장 쉽게 재현되는 것처럼 보입니다 (재건이 잘못되어있는 것은 아닙니다).

+0

죄송합니다. 이미 fuslog를 확인하신 것 같습니다. 이것은 수면 모드에서 내 두뇌입니다! –

+0

그냥 이것을 생각해보십시오. Google에 따르면 - 80070003은 디렉토리를 찾을 수 없거나 파일을 찾을 수 없음 -이 변경 사항이 있습니까? –

+0

도움이되지 않습니다 - 왜 그것을 찾을 수없는지도 모르겠다. 실제 파일의 경로를 가지고 있으며, 섀도 복사본 캐시 디렉터리가 어디에 있는지 알고 있으므로 찾을 수없는 것이 무엇인지 알 수 없습니다. – citizenmatt

답변

2

Phew. 문제는 (자연스럽게) ReSharper 8의 동작에서 미묘한 변화였습니다.

테스트 러너 프로세스 API는 테스트 실행에 사용 된 임시 폴더의 위치를 ​​ReSharper 프로세스 (예 : devenv.exe)에 알리는 방법을 가지고 있습니다 - 섀도 복사본 캐시 테스트 러너 프로세스는 일반적으로 캐시 폴더가 아직 사용 중이므로 삭제할 수 없기 때문입니다. 그러면 ReSharper가 폴더를 삭제하려고 몇 번 시도하여 프로세스가 정상적으로 종료 될 때까지 기다립니다.

ReSharper 7.1은 테스트가 끝나거나 실행이 중단 된 경우이 폴더를 삭제합니다.

ReSharper 8은 메서드를 호출하자마자 폴더를 삭제합니다. nunit 테스트 주자는 테스트 실행 중 에 대해 ReSharper에게 알려줍니다. 나는 그것에 대해 시작에서 말하고 있었다. 그래서 ReSharper는 내 테스트가 진행되는 동안 행복하게 나올 것이고, 섀도 복사본 캐시에서 무엇이든지 삭제할 수 있으므로 섀도 복사본 캐시가 제대로 깨져있는 것처럼 보입니다.

나는 버그를 제출할 것이라고 생각합니다. :)

관련 문제