我是单元测试的新手,我并不总是“看到”需要测试的内容。目前我正在创建单元测试以验证用户是否已从应用中删除。
这是我到目前为止所拥有的。任何人都可以看看这个,并为其他测试事项提出一些建议,或者我为删除用户帐户覆盖了大部分内容?
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);
答案 0 :(得分: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);
}
}
使用此代码,您的所有测试都会通过,并且当您实际上根本不执行任何操作时,您会想到应用程序的成员身份功能正常工作。一般来说,一个很好的方法来判断你的单元测试是否有用,就是试图打破它们。如果你可以让你的单元测试谎言,那你写错了。
答案 1 :(得分:1)
您应该在致电status
后检查user
和CreateUser()
是否符合预期。
首次致电user = prov.GetUser("UserX", false);
后,您应该检查user
是否符合预期。例如,检查它是否为空且用户名是否正确。
目前尚不清楚DeleteUser()
是否有返回值。如果是,请确保检查该值。