2012-06-06 57 views
2

我在這裏看到了幾個處理類似問題的問題,但他們都沒有幫助我。由於企業庫導致的NUnit測試失敗

我在MVC 3項目中使用了VS 2010中的NUnit。 我有一個測試項目,並正在寫我的第一個測試Evar! :-)

你不自豪我終於開始了嗎?!

這裏是我得到

Microsoft.Practices.ServiceLocation.ActivationException錯誤:嘗試獲取類型的數據庫實例發生激活 錯誤,關鍵 「MyConnection的」 ----> 微軟.Practices.Unity.ResolutionFailedException:解決方案 依賴項失敗,類型= 「Microsoft.Practices.EnterpriseLibrary.Data.Database」,名稱= 「MyConnection」。發生異常時:解析時。例外是: InvalidOperationException - 無法構造數據庫類型。 您必須配置容器以提供此值。

我已經配置了web.config這一切,當在測試未運行數據返回完美,所以我知道它不是每CE垂死的配置,與NUnit的使用時,它只是死亡。

這是我的聯繫方式:

<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> 

我一直在使用的NuGet也做一個乾淨的手動參考安裝DAAB。無論哪種方式,數據加載罰款在正常使用的情況,但在測試中會死在這行:

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昨天在TekPub上開始了TDD碩士課程(由本書的作者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()) 

從您的單元測試這一點非常直截了當。任何時候,在各種代碼中調用方法查找時,都會測試模擬並返回您的預期數據。

+0

看,這就是我喜歡的原因!好吧,所以我不知道。我只是假設我正在測試行爲,而我期望的行爲是返回數據並驗證我得到了我所要求的。所以我不知道該如何處理。一些背景,應用程序不過是一個用戶界面,允許用戶搜索學校並查看有關該學校的數據。沒有業務邏輯,沒有數據更新,在我看來,沒有比「用戶搜索輸入是否回饋了預期的內容」更難以測試的東西了。我不明白這會如何嘲笑我真正有用的信息。 –

+0

但正如jflood所說,這些類型的測試比單元測試更具綜合性測試。是對的嗎?我是否浪費時間甚至試圖用這種應用程序進行測試? –

+0

這正是嘲笑的重點。模擬消除了數據庫的依賴性。測試數據庫需要進行設置和維護,以確保返回到測試的輸入有效。模擬你的「預期數據」總是你設定的。這樣你可以確保你的測試功能不依賴於你的數據庫。也就是說,如果你想探索一個利用你的數據庫的集成類型測試方法,我會建議:http://blog.codeville.net/2009/06/11/integration-testing-your-aspnet-mvc-application/ – Jesse

相關問題