C# 单元测试模型-建议

C# 单元测试模型-建议,c#,oop,unit-testing,C#,Oop,Unit Testing,我有一个多人参与的项目。我一直在为我们的项目构建单元测试。(我知道这些应该从第一天起就存在,但我是在项目开始后加入的。) 我们有很多模型,有很多属性。我想知道您是否建议我创建单元测试来测试这些模型是否正确实例化以及属性是否设置?我不会测试它们是否正确加载到ORM框架中。但是,如果测试中包含一些逻辑,我会添加测试,例如: private IList<User> _allUsers; public IEnumerable<User> GetActiveUser { g

我有一个多人参与的项目。我一直在为我们的项目构建单元测试。(我知道这些应该从第一天起就存在,但我是在项目开始后加入的。)


我们有很多模型,有很多属性。我想知道您是否建议我创建单元测试来测试这些模型是否正确实例化以及属性是否设置?

我不会测试它们是否正确加载到ORM框架中。但是,如果测试中包含一些逻辑,我会添加测试,例如:

private IList<User> _allUsers;

public IEnumerable<User> GetActiveUser
{
   get { return _allUsers.Where(u => u.IsActive);
}
私人IList用户; 公共IEnumerable GetActiveUser { 获取{return}alluser.Where(u=>u.IsActive); }
这可能需要一些测试来确保您只获得活动用户。

测试您正在使用的任何框架或数据访问层以及模型本身内置的任何业务逻辑是否正确持久化了模型

我喜欢使用NUnit+Fluent断言来比较持久化操作前后的模型(例如创建和保存模型,并确保它使用所有值正确检索)

请注意,它不一定是严格意义上的持久性。可能您的模型是一个视图模型,并且由映射器从业务实体映射而来。我也会对此进行测试。基本上,您希望测试模型是否正确地通过某个层或逻辑进行转换,而不是测试模型本身(当然,除了内置于其中的任何业务逻辑).测试语言或框架功能/编译器正在工作,就像测试属性是否工作一样,在我看来似乎是浪费时间

粗略的例子:

  // arrange
  var expected = new PersonModel
                  {
                     FirstName = "John",
                     LastName = "Doe",
                     DateOfBirth = DateTime.Now
                     // etc
                   }

   // act
   var id = InsertModelAndReturnId(expected);
   var actual = RetrieveModelById(id);

   // assert
   actual.ShouldHave().AllProperties().EqualTo(expected); // ShouldHave is from Fluent Assertions. This line makes sure expected and actual have the same values after being persisted and retrieved

在大多数情况下,您应该专注于逻辑而不是数据。这意味着您不应该测试状态,而应该测试行为

属性后面可能有一些行为。例如,更改一个属性的状态会影响其他属性的值(但在这种情况下,我们仍然会测试行为而不是状态)

每一个单元测试都应该讲述一个关于被测类的故事(c)。太多无用的单元测试可能会隐藏有关系统的相关或重要信息,实际上会降低可维护性,而不是增加可维护性


实事求是地向系统的最重要部分添加测试,首先覆盖最复杂的业务逻辑,然后将它们转移到系统的其他部分。

我只测试其getter/setter包含自定义逻辑的属性。对于普通属性(例如:
{get;set;}
)我认为单元测试没有用。不确定你是在说测试属性本身(link有很多很好的答案),还是在实例化之后测试属性值。不管怎样,你都应该测试它们。