Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#设计问题_C# - Fatal编程技术网

C#设计问题

C#设计问题,c#,C#,如何进行私有方法的单元测试 我有一个类将员工数据加载到数据库中。以下是一个示例: > 我正在编写一个应用程序来获取序列化对象(例如上面的Employee)并将数据加载到数据库中 我有几个设计问题,我想征求意见: 我之所以称这个类为“EmployeeFacade”,是因为我(试图?)使用facade模式。在类名上命名模式是一种好的做法吗 B-将我的DAL层类的具体实体称为“存储库”好吗,例如“EmployeeRepository” C-以这种方式使用存储库是明智的还是我应该在存储库本身上创建一个方

如何进行私有方法的单元测试

我有一个类将员工数据加载到数据库中。以下是一个示例:

>

我正在编写一个应用程序来获取序列化对象(例如上面的Employee)并将数据加载到数据库中

我有几个设计问题,我想征求意见:

我之所以称这个类为“EmployeeFacade”,是因为我(试图?)使用facade模式。在类名上命名模式是一种好的做法吗

B-将我的DAL层类的具体实体称为“存储库”好吗,例如“EmployeeRepository”

C-以这种方式使用存储库是明智的还是我应该在存储库本身上创建一个方法来获取(比如)员工,然后从那里加载数据,例如EmployeeRepository.LoadAllEmployeeData(Employee-Employee)?我的目标是内聚类,但这将要求存储库了解Employee对象,这可能不好

有没有什么好办法不必在每个方法的开头检查对象是否为null

我有一个EmployeeRepository,TaxRepository,AccountRepository,声明为公共的,用于单元测试。这些确实是私有的enities,但我需要能够用存根替换它们,这样就不会写入我的数据库(我重载save()方法,使其什么也不做)。这是真的吗?还是我必须把它们暴露出来

F-我如何测试私有方法-或者这样做了(有人告诉我没有)

G-“emps.Name=employee.EmployeeDetails.PersonalDetails.Active.Names.FirstName;”这违反了德米特的法律,但我如何调整我的对象以遵守法律

如何进行私有方法的单元测试

您不应该为私有方法编写测试


创建私有方法的唯一可能方法是重构已经测试过的公共方法。

a-我认为在类名中使用模式名并不特别糟糕,尽管我真的不知道这样做的频率

我认为虫族是对的,你可能必须公开它们,测试它们,然后在你满意的时候将它们保密。一旦它们是私有的,您仍然可以测试使用私有方法来确保它们继续工作的公共方法

至于您的DAL之类的,我建议您研究LINQtoSQL,它在.NET3.0及更高版本中提供。这是一个很好的框架,用于处理业务逻辑和数据库之间的抽象层。这里有一些链接可以查看


Scott Guthrie在LINQ上有很多好东西,如果你感兴趣,你应该多看看他的帖子。

a-我不会称之为XXXFacade,但有一些更有意义的东西(实际上可能意味着你应该称之为XXXFacade)

B-我会叫他们XXXRepository

C-我不太理解您的模型-您正在传入一个Employee对象,并将其值赋给EmployeeRepository中的等效值。存储库不应包含数据字段-存储库的每个实例不代表数据库中的一行。存储库是一种通过对数据库中的实体集合进行操作(即:存储库是表,实体是行)来获取数据库中的数据的方法。我希望Repository对象有一个Save方法,该方法将Employee对象作为参数,并将其持久化到数据库中。以及采用Id并返回和Employee的Load方法:

Employee myEmployee = repository.Load(112345);
myEmployee.Name = "New Name";
repository.Save(myEmployee);
通过使用泛型和多态性,存储库基类不需要知道Employee类的具体实现。请看一个关于这种模式的好例子

D-是的,将该公共逻辑放在抽象基类(存储库)中

E-如果它们应该是私人的,不要公开。如果您需要在单元测试中使用存储库的逻辑来模拟获取数据,请实现一个公共接口,然后在测试中模拟该接口。您不需要测试存储库是否返回了正确的数据,因为数据在现实中是暂时的和不一致的。最好是假装它,并测试您的行为是否符合您对模拟存储库中预先准备好的数据的期望

F-不要。测试行为而不是实现


G-如果您按照上述方式检查您的体系结构,我认为这个问题不存在。

A-IMO,是的。它可以立即提醒您模式,并帮助您理解代码,这可能是代码编写中的重要实践之一—让其他人理解您的代码

我更喜欢xxDAO约定(数据访问对象)

我更喜欢“面向服务的编程”,这意味着服务“知道”如何保存员工,而不是“模型”和“控制”混合的“存储库对象”

D-可能使用Aspect,但我不推荐它

E-您可以为那些已分类的类创建一个接口,并使用setter从“外部”注入它们(就像spring那样),或者从某种工厂获取它们,这样您就可以很容易地用mock替换类,并且仍然让成员保持“私有”

F-我认为这些方法应该从“加载员工”的一侧提取出来,并成为自助服务。在我看来,您应该抽象“employee data”对象(特别是如果您有20个对象:-)。并编写一个简单的服务,知道如何加载任何类型的“employee数据对象”

希望我能帮忙,
谢伊

我叫这个班 因为我是 (试图?)使用立面 图案命名是一种好的做法吗 类名上的模式是什么

我不认为测试私人方法是个好主意;但是,您可以测试“内部”类,这些类与
Employee myEmployee = repository.Load(112345);
myEmployee.Name = "New Name";
repository.Save(myEmployee);