2009-07-29 3 views
43

ASP.net 웹 사이트 프로젝트 (.net 3.5)가 있습니다. 현재 비 코드 숨김 코드 파일 (Linq2Sql 항목, 데이터 컨텍스트, 비즈니스 논리, 확장 메서드 등 포함)은 모두 App_Code 폴더에 있습니다.단위 테스트 ASP.net 웹 사이트 App_Code에 저장된 프로젝트 코드

전진 프로젝트의 적어도 일부 섹션에서 단위 테스트 (nunit 사용)를 도입하는 데 관심이 있습니다. 모든 단위 테스트는 현재 App_Code 폴더에있는 모든 코드에 대한 전체 액세스 권한을 가져야합니다. 지금까지 몇 가지 초기 읽기를 수행했고, 합의가 될 것으로 보인다 :

  • 단위 테스트 내 현재 설정 제공 할 수 없습니다 컴파일 된 DLL의 일부 클래스를 참조 필요로하고, 웹 정의에 의한 사이트 프로젝트는 런타임에만 컴파일됩니다.
  • 진행하려면 전체 프로젝트를 웹 응용 프로그램으로 변환하거나 테스트 할 코드 (예 : App_Code의 전체 내용)를 클래스 라이브러리 프로젝트 및 참조로 이동해야합니다 웹 사이트 프로젝트의 클래스 라이브러리 프로젝트 둘 중 하나는 컴파일 된 dll 형식으로 필요한 클래스에 대한 액세스를 제공하므로 유닛 테스트를 수행 할 수 있습니다.

이 정보가 맞습니까? 아니면 프로젝트 전체를 리팩토링하지 않고 Unit Test를 할 수있는 또 다른 방법이 있습니까?

답변

19

결론은 정확합니다. 기능을 하나 또는 여러 개의 클래스 라이브러리 프로젝트로 옮기는 것에 투표 할 것입니다. 다른 프로젝트에서도 동일한 기능을 재사용 할 수있는 문이 열리기 때문입니다.

1

OP가 명시한대로 웹 앱 프로젝트로 이동할 수도 있습니다. 웹 프로젝트 프로젝트는 클리프 (cleaner)라고 말하면서 페이지가 wep 앱 프로젝트에 머물러있을 수 있으므로 DLL (testable)이 1 개 있습니다. 모든 비즈니스 로직 등은 별도의 클래스 라이브러리/라이브러리에 저장됩니다.

+0

, 나는 그것이 영업 이익은이 작업을 수행하는 방법을 알고있는 질문에 명시되어 있기 때문에이 좋은 답변이라고 생각하지 않습니다에

<Target Name="BeforeBuild"> <AspNetCompiler VirtualPath="myIISsitename.com" PhysicalPath="$(SolutionDir)MySiteFolder" TargetPath="$(ProjectDir)\MySite_Precompiled" Force="true" Debug="true" /> </Target> 

결과 DLL이 될 것입니다. 또한이 질문은 이미이 사실을 알고있는 사람들을 대상으로합니다. –

2

그래도 여전히 App_code을 사용하는 동안 가능하지만이 논리를 자체 클래스 라이브러리 프로젝트로 이동하거나 프로젝트 유형을 웹 응용 프로그램으로 변경합니다 (Fredrik 및 Colin이 제안 함).

나는 웹 사이트가 아닌 웹 응용 프로그램 프로젝트로서 항상 내 자신의 ASP.NET 프로젝트를 만듭니다.

+0

링크를 제공해 주셔서 감사합니다. 확실히 추한 솔루션처럼 보입니다. –

+0

그렇습니다. 따라서 더 정상적인 루트 중 하나를 선택하는 것이 좋습니다. – RichardOD

11

우리는 내 회사에서이 문제를 가지고 우리는 우리가 자주 사용하는 그 라운드 두 가지 방법이

(내 상사가, 버전에 대한 몇 가지 쓰레기 ...를 DLL을 좋아하지 않는다) :

1) 가져 오기 단위 테스트를 수행하는 CI 도구 : 우리는 매우 단단한 NUnit 통합을 사용하는 TeamCity를 사용합니다. 우리 솔루션은 이것이 유효한 옵션이 될 수있을만큼 신속하게 (그리고 충분한 테스트가 거의 없습니다.) 빌드합니다.

2) 결과 바이너리를 수동으로 사전 컴파일하고 단위 테스트 : 명령 행에서 ASP.net 컴파일러/MSBuild를 실행하고 ('게시'빌드를 수행하는 것처럼) 완벽하게 결과 바이너리를 테스트 할 수 있습니다 .

그러나 코드를 바이너리 (클래스 라이브러리)로 분리하거나 웹 응용 프로그램을 사용하는 옵션이 있다면 더 나은 대안으로 제안 할 것입니다.

+5

.Net 이전 버전의 dll은 악몽이었습니다. 나는 이것이 "dll 나락"이라고 별명을 붙이게되었다라고 생각한다. 닷넷을 사용하면 더 이상 문제가되지 않습니다. – TheLukeMcCarthy

20

내 상점에서 마침내 MVC 프로젝트에 대한 답변을 얻었습니다. 그리고 StackOverflow 청문회에서 많은 사람들이 쫓기면서 그것을 공유하고 싶습니다. 많은 사람들이 그것을 할 수 없다고 말합니다.우리는 이런 식으로 작업을 수행합니다

  • 열고 MVC 폴더를 "웹 사이트로, 지역 IIS에서"인텔리 및 디버깅이 제대로 작동
  • 우리의 소스 제어 디렉토리
  • 에 사는 단위 테스트 프로젝트를 추가 취득
  • 웹 사이트로 열려있는 프로젝트에 프로젝트를 추가 할 수 없으므로 TEST 프로젝트에 사전 빌드 단계를 추가하십시오. 웹 사이트가 \ FooSite이고 테스트 프로젝트가 \ FooSite.Tests라고 상상해보십시오. 컴파일 된 앱 코드는 FooSite.Tests \ FooSite_Precompiled \ bin에 으로 끝납니다.
  • *
    <Target Name="BeforeBuild"> 
        <AspNetCompiler VirtualPath="FooSite" TargetPath="$(ProjectDir)\FooSite_Precompiled" Force="true" 
    Debug="true" /> </Target> 
    
    은/App_Code.dll 테스트 프로젝트에서 FooSite_Precompiled/빈에 대한 참조를 추가합니다.
  • 붐 그게 전부 야. 당신은 당신의 케이크를 가지고 그것을 먹을 수 있습니다. 솔루션에서 빌드를 클릭 할 때마다 MSBuild와는 달리 app_code를 컴파일 할 수있는 웹 사이트 csproj (아직 존재 함)에 aspnet_compiler.ext 도구 을 호출하고 app_code를 컴파일하려면 Debug = "true"를 사용하면 을 단계적으로 수행 할 수 있습니다 단위 테스트를 디버깅 할 때 app_code.dll 코드. 그리고 은 업데이트 된 단위 테스트를 실행할 때만 빌드하면됩니다. 페이지에서 변경 한 효과를보고있는 경우 코드 변경/app_code 폴더 이후에 페이지 저장/새로 고침 은 웹 서버에서 호출 될 때 컴파일됩니다.
+0

이것은 허용 된 대답이어야합니다. 테스트 프로젝트를 빌드 할 때 AspNetCompiler를 실행하는 것은 매우 느리다고 추가하겠습니다. 따라서 Exec 태스크를 사용하여 App_Code 파일 만 빌드하면됩니다. –

+0

어떻게 정확히 설정 했습니까? 특정 msbuild 명령을 호출하는 임무 작업은 무엇입니까? 예를 들려 주시겠습니까? –

+0

우리는 Exec 태스크와 함께 호출되는 독점적 인 도구를 사용하지만 CSC를 직접 호출하거나 App_Code 폴더의 모든 소스 파일을 포함하는 별도의 프로젝트 파일을 사용하여 가능해야합니다. 이제는 Visual Studio 2012에서이 시스템의 문제점을 최근에 경험 했으므로 지금이 질문을해야합니다. 문제를 해결할 수있는 사람이 있는지 질문을 게시하고 하나는 내가 사용하고 있습니다 : http://stackoverflow.com/questions/13138820/visual-studio-2012-msbuild-incremental-build-not-detecting-changes –

5

사람 자체가 브라이언의 솔루션을 구현 찾을 경우, 여기 Website.targets 당신이 단위 테스트 솔루션에 포함시킬 수있는 파일입니다. App_Code가 변경된 경우에만 웹 사이트를 다시 컴파일합니다. 그냥

<PropertyGroup> 
    <WebsiteName>MyWebsite</WebsiteName> 
    <WebsitePath>..</WebsitePath> 
    </PropertyGroup> 
    <Import Project="$(ProjectDir)\Website.targets" /> 
    <Target Name="BeforeBuild" DependsOnTargets="CompileWebsite"> 
    </Target> 
WebsiteName을 사용자 정의하여 .csproj에

WebsitePath 같은 것을 추가하고 당신은 갈 준비가되어 있어야합니다. Website.targets :

<?xml version="1.0" encoding="utf-8"?> 
<!-- 
    Target that compiles Website's App_Code to be used for testing 
    --> 
<Project DefaultTargets="CompileWebsite" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
    <AppCodeFiles Include="$(WebsitePath)\$(WebsiteName)\App_Code\**\*.*" /> 
    </ItemGroup> 
    <Target Name="CompileWebsite" Inputs="@(AppCodeFiles)" Outputs="$(ProjectDir)\PrecompiledWeb\bin\App_Code.dll"> 
    <AspNetCompiler VirtualPath="$(WebsiteName)" PhysicalPath="$(WebsitePath)\$(WebsiteName)" TargetPath="$(ProjectDir)\PrecompiledWeb" Force="true" Debug="true" /> 
    </Target> 
    <Target Name="CleanWebsite"> 
    <RemoveDir Directories="$(WebsitePath)\$(WebsiteName)\PrecompiledWeb" /> 
    </Target> 
</Project> 
0

그것은 클래스 라이브러리 프로젝트에 클래스를 앱 웹에 프로젝트를 변환하거나 이동하지 않고 App_Code 폴더에 저장 단위 테스트 클래스에 가능하다.

모두 필요한 것은 코드 파일의 빌드 작업을 컴파일로 설정하는 것입니다. 그러면 웹 사이트 디버깅 및 유닛 테스트에서 .dll 파일을 출력하게됩니다.

이제 단위 테스트 프로젝트에서 웹 사이트 프로젝트를 참조하면 app_code 폴더의 클래스가 표시됩니다.

참고 :

당신의 .cs 파일 'Build ActionCompile에 귀하의 웹 사이트가 디버깅 및 단위 테스트에 .dll 파일을 생성하게됩니다 설정. .dll 파일은 IIS가 이제 bin 및 App_Code 폴더의 두 위치에서 코드를 찾고 사용할 코드를 알 수 없으므로 웹 사이트를 디버깅 할 때 문제를 일으킬 수 있습니다. 현재 디버그 할 때 .dll 파일 만 삭제합니다.

+0

내 대답이 왜 실패했는지 이해할 수 없습니다. 단위 테스트를하는 유일한 방법은 코드를 클래스 라이브러리 프로젝트로 옮기거나 솔루션을 웹 애플리케이션으로 변환하는 것이고, 나의 대답은 app_code 폴더에 코드를 유지하면서 유닛 테스팅을 수행하는 방법을 보여주는 것이라고 생각하는 것은 잘못입니다. 제 대답이 형편없는 형식이라면, 유권자가 싫어하는 점을 설명해 줄 수 있기를 바랍니다. –

0

PhysicalPath 특성을 추가하여 Brian White의 솔루션을 변경해야했습니다.또한 Default Web Site을 사용하지 않고 VirtualPath 속성을 내 웹 사이트 이름으로 변경해야했습니다. 이 지식이 유용하지만 MySite_Precompiled\App_Code.dll