2013-02-18 104 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