测试更新属性的方法是一个好习惯吗?

时间:2017-01-20 17:56:27

标签: unit-testing

我正在创建测试,每次我需要更新一个简单的对象时,我都会创建一些测试来检查我将通过该方法传递的所有属性是否都已更改。

例如:

public class User {
   public string name { get; private set }
   public string email { get; private set }
   public string password { get; private set }

   public void UpdateData(string name, string email, string password){
    //update fields
 }
}

测试类:

[TestMethod]
public void Should_Update_Data(){
   var arrange = {
      name: "NewName",
      Email: "NewEmail@Something.com",
      Password: "123456"
   }

   var user = new User();
   user.UpdateData(arrange.name, arrange.Email, arrange.Password);

   //Assert user.name equals arrange.name  
   //Assert user.email equals arrange.email
   //Assert user.password equals arrange.password
}

但是我很困惑,如果做这么多断言是一个很好的做法,检查我正在更新的所有属性真的更新是非常无聊的......

3 个答案:

答案 0 :(得分:1)

我认为做许多断言一定是不好的做法,但保持测试执行单个断言肯定有好处:

  • 测试更专注
  • 更容易理解正在测试的内容
  • 断言不会掩盖其他断言,即如果user.name断言失败,那么user.email永远不会被执行,这会导致更长的反馈周期

您试图通过测试防止发生什么样的回归?检测这些回归是否有效?编译器是否以同样的方式保护您?

答案 1 :(得分:0)

updateData的合同是对这些元素进行更新。因此,您需要对其进行测试。但是,您无需显式测试它。如果测试的另一部分涵盖 updateData部分,则可以依赖该覆盖率作为隐含测试。

答案 2 :(得分:0)

我认为你的实际方法不仅仅是设置一些属性。如果没有,我不会测试这些方法,因为它对测试来说太微不足道了。

如果它更复杂,你需要进行一些单元测试。至于你在单个方法中使用各种断言的问题,我倾向于设置我的测试有点不同,以便断言是分开的。

我在initialize方法中设置并执行代码,然后在不同的方法中安排断言:

[TestClass]
public class UpdatingData
{
    User user;
    dyanmic arrange = {
       Name: "NewName",
       Email: "NewEmail@Something.com",
       Password: "123456"
    };

    [TestInitialize]
    public void Because(){      
       user = new User();
       user.UpdateData(arrange.Name, arrange.Email, arrange.Password);

       //Assert user.name equals arrange.name  
       //Assert user.email equals arrange.email
       //Assert user.password equals arrange.password
    }

    [TestMethod]
    public void UpdatesTheName() => Assert.Equals(user.Name, arrange.Name);

    [TestMethod]
    public void UpdatesTheEmail() => Assert.Equals(user.Email, arrange.Email);

    [TestMethod]
    public void UpdatesThePassword() => Assert.Equals(user.Password, arrange.Password);

}