使用Nunit测试构造函数

时间:2009-11-05 03:36:31

标签: c# unit-testing nhibernate nunit

我是Nunit测试的新手,我想测试以下构造函数:

public class IngredientDAONHibernate : NutritionLibrary.DAO.IngredientDAO

    {

          private Configuration config;
        private ISessionFactory factory;

        public IngredientDAONHibernate()
        {
            try
            {
                config = new Configuration();
                config.AddClass(typeof(NutritionLibrary.Entity.Ingredient));
                config.AddClass(typeof(Entity.Nutrient));
                config.AddClass(typeof(Entity.NutrientIngredient));
                       factory = config.BuildSessionFactory();
            }
            catch (Exception e)
            {

                // logger.Error("Exception Occured", e);
            }
        }

测试存根如下:

[TestMethod()]
        public void IngredientDAONHibernateConstructorTest()
        {
            IngredientDAONHibernate target = new IngredientDAONHibernate();

        }

有人可以帮我提一些关于我如何开始的提示吗?谢谢!

3 个答案:

答案 0 :(得分:1)

我建议你不要抓住所有的例外情况,但是,如果你确定要抓住并忽略那些,那就去做那些,否则很难判断你是否有问题。

我倾向于不测试构造函数,除非它做了很多,并且很明显,如果在执行其他单元测试时出现问题,因为如果构造函数失败,您应该看到异常,并且由于所有测试都将失败。

如果要测试此构造函数,请限制异常,并确保在运行测试时没有异常。

答案 1 :(得分:1)

让我回答你的问题..你怎么知道构造函数是否按预期执行?

通常构造函数是微不足道的..但是在这里看起来你有一些第三方的lib接口代码,你需要一些信心。

如果您只想测试构造函数中没有引发异常...则提取记录器接口。现在你在模拟记录器的测试过程中(假的也可以),这可以帮助你感知是否记录了异常。

[TestMethod()]
        public void IngredientDAONHibernateConstructorTest()
        {
            _errorLogged = false;
            ILogger logger = this; // make test fixture implement the logger interface ; self-shunt
            IngredientDAONHibernate target = new IngredientDAONHibernate(logger);

            Assert.IsNotNull(target);
            Assert.IsFalse(_errorLogged, 
               String.Format("ERROR! Constructor has thrown {0}", _loggedException) );
        }

        bool _errorLogged;
        Exception _loggedException;
        public void Error(string message, Exception e)
        { 
           _errorLogged = true;
           _loggedException = e;
        } 

答案 2 :(得分:1)

和其他人一样,我会警告不要捕捉异常。文档应告诉您可以预期的异常,如果有意义,您可以为每个异常编写特定的Catch子句。

除此之外,您的测试应验证您的对象是否处于您期望的状态。鉴于我们可以看到的,你所能做的只是测试它不是空的。如果您可以强制执行异常,则可以测试记录器是否收到异常消息。如果有一个公共属性可以访问您的工厂,您可能希望测试它(不是null,也许是其他东西),并且同样使用config字段。为此,如果您可以访问添加的类,则可以测试非null并计算== 3。如果确切的对象很重要,您可以测试它们在那里。决定信任多少第三方的东西总是很棘手。一般来说,除非我得到我不应该的证据,否则我会这样做。

在测试方法方面,尽可能测试每个参数。因此,对于字符串,测试null和emptystring以及相关(有效和无效)值。如果您期待字母数字,也可以测试特殊字符。如果数据在边界和边界的任何一侧都有边界测试值加上典型值。例如。如果您期望0到10之间的int,请测试-1,0,1,5,9,10,11。只需几秒钟即可完成写入但是当您尝试修复时,它可以在两年内节省您的时间一个错误。