.net中单元测试

单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。

xUnit 是一个适用于 .NET 的免费、开源、面向社区的单元测试工具。xUnit.net 由 NUnit v2 的原发明者编写,是针对单元测试 .NET 应用的最新技术。xUnit.net 适用于 ReSharper、CodeRush、TestDriven.NET 和 Xamarin。它是 .NET Foundation 的项目,并在其行为准则下运行。.

可以直接对方法进行异常测试,也可以对模拟对象进行异常测试,但是,对模拟对象进行异常测试,很少用,所以,这里就介绍对方法的异常测试。请看如下代码,当用户名为空的时候,抛出异常。

 
public bool Valid(string userName, string passWord)
 
  {
 
    if (string.IsNullOrEmpty(userName)) throw new ArgumentNullException("userName is null");
 
    var isValid = userName == "admin" && passWord == "123456";
 
    Log.Write(userName);
 
    return isValid;
 
  }

这里用到了一个LastCall的一个类,比较常用,一些辅助测试的功能,都在该类中。

[Test]
public void Valid_Return()
{
  MockRepository mock = new MockRepository();
  var log = mock.DynamicMock<ILog>();
  using (mock.Record())
  {
    log.WriteLog("admin");
    LastCall.Return(0);
  }
  var returnValue = log.WriteLog("admin");
  Assert.AreEqual(returnValue, 0);
}   

   [TestMethod]
        public void Test_QuestionInsert()
        {
            //MongoHelper.RigisterConventions();
            //var num = new Random().Next(100000, 1000000);
            //new QuestionBll().Insert(new QuestionForAdd
            //{
            //    AnswerValue = new Random().Next(1, 5),
            //    CategoryId = "57ecd3aa3a19a5287ccaa7f0",
            //    Title = "题目题目题目" + num++,
            //    Options = new List<AnsQuestionOptions>
            //    {
            //        new AnsQuestionOptions {Img = null, Text = "选项选项选项" + num++, Value = 1},
            //        new AnsQuestionOptions {Img = null, Text = "选项选项选项" + num++, Value = 2},
            //        new AnsQuestionOptions {Img = null, Text = "选项选项选项" + num++, Value = 3},
            //        new AnsQuestionOptions {Img = null, Text = "选项选项选项" + num, Value = 4}
            //    },
            //    Type = QuestionType.DoubleText
            //});
        }