2011-05-13 20 views
0

我目前正在研究一個繼承的代碼庫。關鍵的缺失部分之一是單元測試。我試圖在NUnit中設置一些單元測試,似乎遇到了障礙。單元測試帶有由SubSonic生成的DAL的應用程序

我創建了一個單獨的單元測試項目,並添加了對SubSonic,NUnit和應用程序創建的各種DLL的必要參考,並設置了一個虛擬單元測試以確保所有設置都正確。當我試圖引用由SubSonic生成的一些對象時,問題就開始了。我創造了這個測試列表中的用戶:

[Test] 
public void CanListUsers() 
{ 
    UserCollection users = UserController.List(UserController 
               .Query() 
               .Where(User.Columns.IsDeleted, false)); 
    Assert.IsNotNull(users); 
} 

,並得到此異常:

Can't find the SubSonicService in your application's config

我固定,通過拉出這是亞音速到一個app.config相關的Web.config的部分在單元測試項目中。現在,當我重新運行單元測試,我得到:

UnitTests.TestClass.CanListUsers: System.Reflection.TargetInvocationException : Exception has been thrown by the target of an invocation. ----> System.Configuration.ConfigurationErrorsException : Could not load type 'Utility.SqlSubsonicProvider' from assembly 'System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.

這個例外有我困惑,因爲SqlSubsonicProvider是本實用命名空間中的類,並且可以在對象瀏覽器,從而可以看出爲什麼它正在系統尋找。網?

編輯:好的,我重新安排瞭解決方案中的命名空間,以便它們更有意義。我認爲這解決了上述錯誤。不幸的是,我現在收到此錯誤:

ChannelMechanics.UnitTests.TestClass.CanListVendors: 
System.Reflection.TargetInvocationException : Exception has been thrown by the target 
of an invocation. 
    ----> System.NullReferenceException : Object reference not set to an instance of 
     an object. 

什麼是更奇怪的是,當我在調試菜單使用Visual Studio的「附加到進程」命令,附加到NUnit的GUI的單元測試通過。我的理論是,空對象很容易從調試器中發現。

如果有幫助,我的App.config看起來是這樣的:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="SubSonicService" 
      type="SubSonic.SubSonicSection, SubSonic" 
      requirePermission="false"/> 
    </configSections> 
    <connectionStrings> 
    <add name="DatabaseConnection" 
     connectionString="*removed*"/> 
    </connectionStrings> 
    <SubSonicService defaultProvider="TestProvider"> 
    <providers> 
     <clear /> 
     <add name="TestProvider" 
      type="SubSonic.SqlDataProvider, SubSonic" 
      connectionStringName="DatabaseConnection" 
      generatedNamespace="Test"/> 
    </providers> 
    </SubSonicService> 
</configuration> 

異常的詳細信息是:

at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, 
      Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, 
      RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) 
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, 
      Boolean fillCache) 
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, 
      Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) 
at System.Activator.CreateInstance[T]() 
at SubSonic.ActiveController`2.Query() 
at UnitTests.TestClass.CanListVendors() in UnitTests\TestClass.cs:line 59 
--NullReferenceException 
at DataAccess.Vendor.GetTableSchema() in DataAccess\Generated\Models\Vendor.cs:line 376 
at DataAccess.Vendor.SetSQLProps() in DataAccess\Generated\Models\Vendor.cs:line 42 
at DataAccess.Vendor..ctor() in DataAccess\Generated\Models\Vendor.cs:line 35 

,我運行的測試基本相同,上面列出的一個除了應該獲得列出的供應商而不是用戶。

[Test] 
public void CanListVendors() 
{ 
    VendorCollection vendors = VendorController.List(
             VendorController 
             .Query() 
             .Where(Vendor.Columns.IsDeleted, false)); 
    Assert.IsNotNull(vendors); 
} 

回答

0

這似乎是現在的工作。我在該項目中做出的唯一更改是使用Visual Studio的單元測試功能創建單獨的測試項目。我能想到的另外一個解釋是,當我在昨天晚上和今天之間重新啓動計算機時,有些麻煩的事情被拋出內存。

對於任何人絆倒在未來這個問題的好處,這裏的步驟概述我把得到的NUnit用於測試由亞音速生成的DAL:

  • 創建新的類庫項目。
  • 添加必要的參考 - 我添加了DAL,NUnit和SubSonic。
  • 添加一個App.config文件,以便 SubSonic知道在哪裏可以找到 SubSonic服務。我爲此 所做的全部工作是拔出 Web.config中與 SubSonic相關的部分。
  • 添加測試類並開始向其添加測試。

如果測試失敗莫明其妙,確保「複製到輸出目錄」設置爲「複製,如果新」爲已添加的App.config中,確保在App.config中提供者的名稱相匹配的DAL類中使用的提供程序名稱,如果其他所有操作都失敗,請重新啓動!

0

我建議有一個System.Web.Utility命名空間,因爲編譯器「認爲」他有看這個命名空間內解決的類,你得到這個錯誤的錯誤消息。 請檢查您的測試項目是否設置爲框架「框架4」而不是「框架4客戶端配置文件」。

Missing ".NET Framework 4 Client Profile" as target framework in "New Project" window

+0

是的,我認爲這個項目中的命名空間肯定有些奇怪的東西。我已經使用Microsoft Northwind創建了一個測試項目,並且能夠按預期連接到它。我想這是處理別人代碼的樂趣之一 - 在意想不到的地方發生意外錯誤! – Malice 2011-05-16 07:42:12

0

你總是有亞音速不亞音速?

這是從我的NUnit的項目配置文件,其作品的相關部分...

​​
+0

感謝邁克,這實際上是我檢查的第一件事情之一,在整個項目中名稱絕對是SubSonic。有時答案很簡單,而不是這次不幸! – Malice 2011-05-16 07:43:28