【问题标题】:unit testing with mock and possibility of unit testing模拟单元测试和单元测试的可能性
【发布时间】:2014-03-13 06:20:49
【问题描述】:

我是单元测试的新手。

 public List<BookList> GetBookList(int bookid)
    {
        List<BookList> _BookList = new List<BookList>();
    //Consider if some wcf call is there then how we can develop unit test
        using (DataClassesDataContext context = new DataClassesDataContext(_strConnectionStringName))
        {
            foreach (tblBook_Sel_BasedOnbookIDResult _tblBook_selResult in context.tblBook_Sel_BasedOnBookID(bookid))
            {
                BookList _bookListObject = new BookList();
                //Setting the proerty here
                _BookList .Add(_bookListObject);
            }

        }
        return _BookList;
    }

我想为此方法编写单元测试。请建议我可以通过单元测试来测试上述功能的哪些场景以及如何测试。如果您可以详细说明一些代码示例以及模拟如何在上面帮助我们,我可以更好地理解场景。提前致谢。

【问题讨论】:

  • 如果你想开始单元测试,你首先可能想掌握一些提高可测试性的实践。您没有使用接口,而是使用硬编码依赖项。 Infer-On 他的 anwser 非常接近您应该做的事情。按照他的示例应该可以让您轻松地模拟数据库并创建单元测试。

标签: c# unit-testing mocking


【解决方案1】:

你对数据访问类有很强的依赖,所以你可能应该注入它,如果你有上下文作为类成员,通过构造函数的注入初始化,你可以很容易地从你的单元测试中模拟它;最好的方法是使用带有 IDataAccess 参数的构造函数。

编辑: 这个sn-p可能有问题,但想法是:

public interface IDataClassesDataContext
{
  tblBook_Sel_BasedOnbookIDResult tblBook_Sel_BasedOnBookID(int bookid);
}

public partial class DataClassesDataContext:IDataClassesDataContext
{

}

public class Class1
{
  IDataClassesDataContext _context;
  public Class1(IDataClassesDataContext context)
  {
    _context = context;
  }

  public List<BookList> GetBookList(int bookid)
  {

    List<BookList> _BookList = new List<BookList>();
   //Consider if some wcf call is there then how we can develop unit test
    using (_context)
    {
      foreach (tblBook_Sel_BasedOnbookIDResult _tblBook_selResult in _context.tblBook_Sel_BasedOnBookID(bookid))
        {
            BookList _bookListObject = new BookList();
            //Setting the proerty here
            _BookList.Add(_bookListObject);
        }

    }
    return _BookList;
 }
}

【讨论】:

  • 请建议我应该如何编写这个方法,这样我才能编写一个有效的单元测试。
【解决方案2】:

这个函数是一个延伸的两行,其中一行是数据访问。我会模拟这个函数来对那些依赖它的人进行单元测试。您不能对其进行单元测试,因为它依赖于外部数据源,因此不是一个单元。如果涉及外部来源,您可以改用integration testing

【讨论】:

  • 对于单元测试,函数应该是一个衬垫?如果函数需要一些数据库调用,那么它应该是不同的方法,并且需要使用来自其他但仍然存在依赖关系的唯一输出,所以我怎么能请提出建议。
  • @Gautam 不,该函数可以有任意多的行来进行单元测试。但它必须是一个unit。您的函数不仅具有外部依赖项(可以模拟和注入),而且实际上仅包含此依赖项。如果你把依赖取出来重新成为一个单元,除了一对空括号之外什么都没有了。
【解决方案3】:

一些可能的场景:

  1. bookId 参数为负数、零和正数。您可以使用int.MaxValueint.MinValue
  2. _strConnectionStringName 为 null、空、无效且有效。
  3. 测试tblBook_Sel_BasedOnBookID 方法可能引发的异常。
  4. 根据BookList 类的属性,您可以拥有多个测试用例。

请注意,您应该在此处调用模拟 tblBook_Sel_BasedOnBookID 方法。这种方法并不真正关心tblBook_Sel_BasedOnBookID 内部发生了什么。但是,您在这里处理具体类型似乎有点困难。

对于服务,应该再次进行模拟服务调用,而不是进行真正的服务调用,并且根据条件,它可以返回硬编码结果或异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 2013-02-22
    • 2011-04-11
    • 2020-05-04
    相关资源
    最近更新 更多