2

비슷한 문제를 다루는 몇 가지 질문을 보았습니다.하지만 그 중 아무도 나를 도왔습니다.엔터프라이즈 라이브러리로 인해 NUnit 테스트가 실패합니다.

MVC 3 프로젝트에서 VS 2010과 함께 NUnit을 사용하고 있습니다. 나는 Tests 프로젝트를 가지고 있고 나의 첫 테스트 Evar를 쓰고있다! :-)

나는 자랑스럽지 않다. 나는 마침내 그것에 도착하고있다! 여기

은 내가

Microsoft.Practices.ServiceLocation.ActivationException 점점 오전 오류입니다 : 형 데이터베이스의 인스턴스를 취득하는 동안 활성화 오류가 발생, 키 "하고 MyConnection"----> 마이크로 소프트 .Practices.Unity.ResolutionFailedException : 해결 방법은 종속성에 실패했습니다. 형식 : "Microsoft.Practices.EnterpriseLibrary.Data.Database", name = "MyConnection". 예외가 발생하는 동안 : 해결하는 중. 예외는 다음과 같습니다. InvalidOperationException - 데이터베이스 유형을 구성 할 수 없습니다. 이 값을 제공하도록 컨테이너를 구성해야합니다.

나는 모든이와 web.config를 구성하고 테스트에서 실행하지 않을 경우 데이터가 NUnit과 함께 사용하면 그냥 죽어 가고, 그래서 나는 그것이 CE 당 죽어있는 설정하지 알고 완벽하게 반환합니다. 내가 NuGet을 사용하고도 깨끗한 설명서를 참조하고있는 DAAB를 설치 한

<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" /> 
... 
<dataConfiguration defaultDatabase="MyConnection" /> 
<connectionStrings> 
<add name="MyConnection" connectionString="Data Source=MyServerName;Initial Catalog=MyDB;user id=MyUser;password=MyPassword" 
    providerName="System.Data.SqlClient" /> 
</connectionStrings> 

:

여기 내 연결 정보입니다. 어느 쪽이든, 고급 데이터로드가이 선에 죽는다 일반적인 사용뿐만 테스트 :

var database = DatabaseFactory.CreateDatabase("MyConnection"); 

public IEnumerable<SchoolSearchResultsDTO> Find(SchoolSearchInputDTO dto) { 
    List<SchoolSearchResultsDTO> fullList; 
    var database = DatabaseFactory.CreateDatabase("MyConnection"); 
    using (var command = database.GetStoredProcCommand("dbo.usp_School_SearchBySchoolName")) { 
     database.AddInParameter(command, "@I_strSchoolName", DbType.String, dto.SearchTerm); 
     database.AddInParameter(command, "@I_intNumberOfRecords", DbType.Int32, dto.MaxSearchResults); 
     using (var reader = database.ExecuteReader(command)) { 
      fullList = new List<SchoolSearchResultsDTO>(); 
      while (reader.Read()) { 
       var fullRecord = new SchoolSearchResultsDTO(); 
       fullRecord.SchoolID = reader.GetInteger("SchoolId"); 
       fullRecord.SchoolName = reader.GetString("SchoolName"); 
       fullRecord.IsDetailedDisplayMode = reader.GetBoolean("IsDetailedDisplayMode"); 
       fullList.Add(fullRecord); 
      } 
      reader.Close(); 
     } 
    } 
    return fullList; 
} 

다른 모든 게시물 잘못된 등등에 대해 이야기이 방법 .. 난 꽤 확실하게 그렇지 않으면 정상적인 사용 하에서 데이터를 얻지 못할 것입니다. 따라서 NUnit과 DaaB를 함께 사용해야합니다.

멋진 아이디어가 있습니까? :-) 모두에게 감사드립니다!

답변

4

조롱 의존성과 관련하여 @Jesse와 동의하십시오. 만약 당신이 그 다음 그 단위 테스트를하지 않아요 수염을 격리 아니에요.(추천 한 책 Art of UnitTesting)

그렇게 계속되면서, 당신은 통합 테스트를 쓰고있다라고 말할 수 있었다.

정확한 설정을 보지 않고 문제가 무엇인지 알기가 어렵습니다. 당신이 언급 한 한 가지는 당신이 "당신의 web.config을 구성했습니다"라는 것입니다.

그러나 테스트 프로젝트에서 설정 파일을 설치 했습니까? 구성은 MVC 프로젝트가 아닌 유닛 테스트 프로젝트에서로드됩니다.

+0

훌륭한 정보! 감사! 필자가 직접 테스트 프로젝트를 생각해 본 적이 없다. 나는 아직도 내 시도에서 허우적 거리는 것 같아. –

+0

테스트 프로젝트에 app.config를 추가하여 수정했습니다 :-) 정보를 제공해 주셔서 감사합니다. 내가 책을 가지고있는 방식으로, 아직 시작하지 않았지만 어제 TekPub에서 TDD Master Course (책 저자 인 Roy Osherove에 의해)를 시작했고, 내가 이것에 매달릴 때까지 따라 갔다. 다리를 위로 주셔서 감사합니다! :-) –

+0

좋은 물건 친구, TDD는 당신이 코드하는 방식에서 가장 큰 변화가 될 것입니다. 처음 몇 가지 장애물이 생기면 나는 그것이 당신을 훨씬 더 생산적으로 만들어 줄 것이라고 생각합니다. –

2

일반적으로 단위 테스트 내에서 데이터베이스를 직접 치지 않는 것이 좋습니다. 귀중하고 믿을만한 단위 테스트를 만드는 것에 관해 조롱하는 방법을 읽으려면 언젠가는 따로 설정하는 것이 좋습니다. 조롱을 통해 관련된 컨트롤러에 조롱 된 서비스 계층을 삽입 할 수 있습니다.이 서비스 계층은 예상되는 데이터베이스 데이터를 반환하도록 설정됩니다.

테스트 중에 해당 서비스 계층의 모의를 만들 것입니다. moq (내 조롱 프레임 워크 환경)를 이용하는 예를 들면 다음과 같습니다

// create your expected data 
var YourExpectedData = new IList<SchoolSearchResultsDTO>(); 

// .... add your expected information 

//create & setup mock 
var _service = new Mock<IYourService>(); 
_service.Setup(service => service.Find(It.IsAny<SchoolSearchInputDTO>())).Returns(YourExpectedData); 

// create your controller 
var controller = new YourCountroller(_service.object()) 

당신의 단위 테스트이 시점에서 매우 정직하고 있습니다. 메소드 find가 다양한 코드 내에서 호출되면 모의 테스트가 시작되어 예상 데이터가 반환됩니다.

+0

보기, 이것이 내가 너무 좋아하는 이유입니다! 좋아, 그래서 나는 이것을 몰랐다. 방금 테스트를 거쳤으며 예상 한 동작은 데이터를 반환하고 내가 요청한 것을 확인하는 것입니다. 그래서 어떻게 처리해야할지 모르겠습니다. 일부 배경으로,이 앱은 사용자가 학교를 검색하고 해당 학교에 대한 데이터를 볼 수있는 UI 이상입니다. 비즈니스 논리가없고 데이터가 업데이트되지 않고 "사용자 검색 입력이 예상했던 것만 제공 했습니까?" 나는 그것이 얼마나 유용한 정보를 제공하는지 조롱하는 것을 보지 못한다. –

+0

그러나 jflood는 이러한 유형의 테스트가 단위 테스트보다 더 많은 통합 테스트라고 말합니다. 그게 맞습니까? 이런 종류의 앱으로 테스트를 시도하는 데 시간을 낭비하고 있습니까? –

+0

바로 이것이 조롱의 요지입니다. 조롱은 데이터베이스의 종속성을 제거합니다. 테스트 데이터베이스는 테스트에 반환 된 입력이 유효한지 확인하기 위해 설정 및 유지 관리해야합니다. 모의로 "예상 데이터"는 항상 당신이 설정 한 것입니다. 그렇게하면 테스트가 데이터베이스에 의존하지 않는 기능을 보장 할 수 있습니다. 즉, 데이터베이스를 사용하는 통합 유형 테스트 접근 방식을 탐색하려면 다음을 권장합니다. http://blog.codeville.net/2009/06/11/integration-testing-your-aspnet-mvc-application/ – Jesse

관련 문제