单元测试与模拟和单元测试的可能性

本文关键字:单元测试 可能性 模拟 | 更新日期: 2023-09-27 17:49:46

我是单元测试新手。

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

我想为这个方法写单元测试。请建议我可以通过单元测试测试上述函数的哪个场景,以及我如何更好地理解,如果您可以详细说明一些代码示例以及mock如何帮助我们在上述场景中。

单元测试与模拟和单元测试的可能性

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

编辑:这段代码可能有一些问题,但思路是:

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

这个函数是一个展开的两行代码,其中一行是数据访问。我将模拟这个函数来对依赖它的函数进行单元测试。您不能对它进行单元测试,因为它依赖于外部数据源,因此不是单个单元。如果涉及到外部源,您可以使用集成测试代替。

一些可能的场景:

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

请注意,这里应该调用模拟tblBook_Sel_BasedOnBookID方法。这个方法并不关心tblBook_Sel_BasedOnBookID内部发生了什么。但是,如果你处理的是具体的类型,这看起来有点困难。

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