2009-03-26 4 views
2

이 오류가 발생했습니다단위 테스트에서 데이터베이스 사용

An attempt to attach an auto-named database for file C:\<...>\Out\MessagesDB.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.. 

컨트롤러 테스트를위한 몇 가지 단위 테스트를 작성하려고 시도했습니다. 나는 문제가 주 프로젝트에서 정의한 데이터베이스를 사용하지 않으려 고 시도했다는 것을 알았다. 그래서 테스트에서 연결 문자열을

으로 수정했습니다. 테스트 프로젝트의 App.config에서

<connectionStrings> 
    <add name="MessagesDBConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\MessagesDB.mdf;Integrated Security=True;User Instance=True" 
     providerName="System.Data.SqlClient" /> 
</connectionStrings> 

을 사용한 다음

를 수행하여 DataDirectory를 재정의했습니다. AppDomain domain = AppDomain. CurrentDomain;

  String currentDirectory = System.Environment.CurrentDirectory; 
     String DataDirectory = currentDirectory.Substring(0, currentDirectory.IndexOf("TestResults")) + "Server\\App_Data"; 
     domain.SetData("DataDirectory", DataDirectory); 
     db = new Server.Models.MessagesDBDataContext(); 

위대한 작품이지만 해킹처럼 보입니다. 어떻게해야합니까?

오늘이 끔찍한 혼란을 또 한번 보았고, Nerd Dinner 예제를 기반으로 프로젝트의 컨트롤러에서 데이터베이스로의 모든 직접 호출을 제거하고 리포지토리 개체로 옮겼습니다 인터페이스 (IRepository)를 구현합니다. 그런 다음 IRepository를 구현 한 가짜 리포지토리 개체를 만들었습니다. 각 컨트롤러에 생성자를 추가하여 IRepository를 전달하여 사용할 수있게했습니다. 그런 다음 기본 제어기 생성자를 변경하여 저장소를 초기화했습니다. 테스트는 더 이상 데이터베이스와의 대화가 없으므로 테스트가 더 빠르고 훨씬 덜 파괴적입니다.

답변

6

표준 접근 방식은 데이터베이스를 조롱하는 것입니다. 즉, 테스트중인 클래스가 데이터를 제공하는 매개 변수를 취하고 데이터베이스 연결처럼 보이는 것을 의미합니다.

단위 테스트에서는 실제로 하드 코딩 된 데이터를 제공하는 구현을 전달합니다.

데이터베이스 쿼리의 결과를 구성 파일에 저장하여 실제 데이터로 테스트를 설정할 수 있도록하는 데 도움이되는 도구가 있지만 신속하게로드하고 변경하지 않기 때문에 이제는 데이터베이스와 별도의 파일에 저장됩니다. SnapDAL은이 도구로 사용할 수 있습니다.

+0

이 작업을 수행 할 수있는 도구에 대해 자세히 설명해 주시겠습니까? 내가 원해! –

+0

Rhino Mocks와 Moq가 조롱합니다. 하지만 인터페이스에 얼마나 익숙합니까? –