1

我是单元测试的新手,我并不总是“看到”需要测试的内容。目前我正在创建单元测试以验证用户是否已从应用程序中删除。

这是我到目前为止所拥有的。任何人都可以看看这个并为其他要测试的东西提出一些建议,或者我是否已经为删除用户帐户覆盖了大部分内容?

            MembershipProvider prov = this.GetMembershipProvider();
            MembershipCreateStatus status;
            MembershipUser user = prov.CreateUser("UserX", "12345", "test.UserX@abc.com", "", "", true, null, out status);

            //call get user
            user = prov.GetUser("UserX", false); 

            //Deletes user and all related information
            prov.DeleteUser("UserX", true);

            // Try to retrieve user again
            user = prov.GetUser("UserX", false);

            //test to see if user has been deleted
            Assert.AreEqual(null, user);
4

2 回答 2

1

这看起来更像是集成测试而不是单元测试。我这样说是因为我假设GetUser,DeleteUser方法进行数据库调用。因此,有多个单元在工作,包括:用户对象的创建、用户对象到数据库的持久性、用户对象的删除以及用户对象的尝试检索。

话虽如此,您应该在每次状态更改后断言您的假设,因为正如您所写的那样,您的方法并不能证明任何事情。从字面上看,每个方法都可以忽略所有输入参数并返回 null - 您的测试将通过。您首先要确保该用户存在,然后才能确定您已将其删除。

想象一下,您MembershipProvider的实现如下:

    public class CustomMembershipProvider : MembershipProvider
    {
          public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, stringpasswordAnswer , bool isApproved, object providerUserKey, ref MembershipCreateStatus  status)
          {
              status = default(MembershipCreateStatus);
              return default(MembershipUser);
          }          

          public override MembershipUser GetUser(string username, bool login)
          {
              return default(MembershipUser);
          }

          public override bool DeleteUser(string username, bool deleteRelatedData)
          {
              return default(bool);
          }
     } 

使用此代码,您的所有测试都将通过,并且您会认为应用程序的成员资格功能正常工作,而实际上它根本没有做任何事情。通常,查看单元测试是否有用的一个好方法是尝试破坏它们。 如果你可以让你的单元测试撒谎,那么你写错了。

于 2013-05-13T21:49:28.117 回答
1

您应该检查statusanduser是您在调用 后所期望的CreateUser()

在你第一次打电话给你之后,user = prov.GetUser("UserX", false);你应该检查一下这user是你所期望的。例如,检查它不为空并且用户名正确。

目前尚不清楚是否DeleteUser()有返回值。如果是这样,请确保检查该值。

于 2013-05-13T21:49:30.650 回答