2013-02-18 64 views
1

我是Nunit測試的新手。 我想寫一個在數據庫中插入數據的方法的測試方法。Nunit - 數據插入測試問題

我的代碼是這樣的:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using NUnit.Framework; 
using MBT.Entities; 


[TestFixture] 
public class TagStoreTest 
{ 
    private Tag testTag; 

    public TagStoreTest() 
    { 
     this.testTag = new Tag(); 
    } 

[Test] 
public void InsertTagTest() 
{ 
    TagStore tagSt = new TagStore(); 
    bool isInserted = tagSt.InsertTag(this.testTag); 

    Assert.IsTrue(isInserted); 
} 


[SetUp] 
public void Setup() 
{ 
    this.testTag.TagName = "testtagthroughNunit"; 
} 

    [TearDown] 
    public void TearDown() 
    { 

    } 

} 

而且實際TagStore代碼是這樣

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using MBT.Datastore; 
using System.Data; 

using MBT.Entities; 


    public class TagStore 
{ 
    private string _connectionString = string.Empty; 

    public TagStore() 
    { 
    this._connectionString = SqlHelper.GetConnectionString(); 
    } 


    public bool InsertTag(Tag tag) 
    { 
    bool isInserted = false; 

    using (DatabaseHelper helper = Utility.DbHelper) 
    { 
     int tagsAdded = helper 
      .AddInputParameter("@Tag", tag.TagName) 
      .AddInputParameter("@ParentTagId", tag.ParentTagId) 
      .ExecuteNonQuery("Proc_InsertTags", CommandType.StoredProcedure); 

     if (tagsAdded > 0) 
     { 
      isInserted = true; 
     } 
    } 
    return isInserted; 
} 
} 

當我運行測試,我得到錯誤:TagStoreTest.InsertTagTest: System.NullReferenceException : Object reference not set to an instance of an object.

和代碼行TagStore tagSt = new TagStore();以紅色突出顯示。

我不知道最近出了什麼問題,因爲我的項目建立成功,但當我運行測試時出現錯誤。

+1

運行NUNIT時通常會有一個堆棧跟蹤。此外,SqlHelper.GetConnectionString()是否有單元測試時沒有正確實例化的任何外部依賴關係? – Alex 2013-02-18 07:58:15

回答

1

我看到你的TagStore構造函數正在設置connectionString成員。嘗試調試返回的內容

SqlHelper.GetConnectionString(); 

您的SqlHelper可能會玩弄技巧。

我也建議嘗試使用某種模擬技術來隔離測試。對於例如你可以模擬總是返回所需連接字符串的SqlHelper對象。有很多框架可用於例如起訂量。

+0

是的..你是對的......它的問題與SqlHelper.GetConnectionString();只有...我檢查stackstrace,它也指向SqlHelper.GetConnectionString(),但是當我嘗試調試代碼,我可以得到正確的連接字符串...在SQLHelper中的代碼是:公共靜態字符串GetConnectionString() { 返回System.Configuration.ConfigurationManager.ConnectionStrings [「ConStr」]。ToString(); },唯一的問題可能是配置管理器,但我在類庫中添加了引用。 – user1181942 2013-02-18 08:48:26

+1

這就是爲什麼你需要隔離你的測試的原因。最初你正在測試你的業務代碼(TagStore),但現在你正在處理連接字符串問題,它將你的工作從工作中轉移出去(並不是說你應該忽略連接字符串問題)。我強烈建議查看一個Mock框架並在你的單元測試中實現它。模擬您的連接對象並測試您的業務代碼。完成BusinessCode後,請使用connectionstring解決問題。想法一次解決了一個問題:) – daehaai 2013-02-18 08:55:36