C# TDD和业务规则-Web API 2.0
不知道我做得对不对 业务规则C# TDD和业务规则-Web API 2.0,c#,asp.net-web-api2,tdd,inversion-of-control,C#,Asp.net Web Api2,Tdd,Inversion Of Control,不知道我做得对不对 业务规则 客户可以不存在于系统中,而不具有属性 当我们删除属性时,客户也会被删除 我添加客户的唯一时间是在添加属性时。(见下文) 帖子:来自客户端的JSON数据 控制器 财产类别 在我的单元测试中,我正在测试PropertyManager类的业务逻辑,以查看是否可以正确添加属性 因此,在流程中创建了一个客户。这必须在同一时间完成——在同一篇文章中(如上面的JSON所述) 现在,我的问题是: (或者我将继续的方式是) 我正在测试添加属性的能力的业务逻辑。上述规则规定,我不会在第
客户
可以不存在于系统中,而不具有属性
属性
时,客户
也会被删除客户的唯一时间是在添加属性时。(见下文)
PropertyManager
类的业务逻辑,以查看是否可以正确添加属性
因此,在流程中创建了一个客户
。这必须在同一时间完成——在同一篇文章中(如上面的JSON所述)
现在,我的问题是:
(或者我将继续的方式是)
我正在测试添加属性的能力的业务逻辑。上述规则规定,我不会在第一次添加属性的情况下添加客户
。因此,我的单元测试以属性为中心
我认为可以通过属性和“我的一天”测试添加客户的能力
对吗
或者,您是否建议重新设计系统,使其与财产和客户解耦?当这两个类在现实世界中存在强耦合时,后者不能与前者共存 TDD是关于测试业务规则的,所以说TDD和业务规则有些矛盾
我的猜测是,您担心在测试中测试多个东西,但请记住,如果逻辑相似,您可以在测试中测试多个东西。因此,在您的实例中,如果业务规则是客户,则必须在具有测试的属性旁边创建,这是完全正确的
例如,您可能有与以下类似的测试:
- 如果拥有的财产不属于例外Rown
- 已成功添加已验证且客户已验证的房地产
然后,您的断言将在属性和客户之间进行检查
旁白
您不必重新设计代码,但在创建属性时创建客户似乎很有趣,所以如果一个人有多个属性,他们会多次出现在您的数据库中?由于我不知道您的要求或业务,这可能是正确的,但似乎是独特的
还要记住,TDD是关于首先编写测试的,如果您已经编写了代码,现在正在编写测试,那么这不是TDD
嗯
// http://localhost:3541/api/property
{
City: "Demo City",
Customer: {Id: 0, Name: "New Customer", Email: "customer@customer.com"},
Id: 0,
Name: "Custom Property Name",
State: "LA",
StreetAddress1: "123 Main St.",
StreetAddress2: "Apt 1",
Type: {Id: 15, Name: "Developer"},
UserId: 174,
Zip: "12345"
}
[Route("api/property")]
[HttpPost]
public async Task<int> AddProperty(Property property)
{
return await propertyManager.AddProperty(property);
}
class PropertyManager{
PropertyManager(){
...
}
PropertyManager(PropertyRepo propertyRepo){
...
}
public int AddProperty(Property property){
int propId = await _propertyRepo.AddProperty(property);
// associate with customer
AddCustomer(property.Customer, propId); // here is my question (see below)
}
// again, here is my question (see below)
private int AddCustomer(Customer customer, int propId){
int custId = _propertyRepo.AddCustomer(customer, propId);
}
}
class Property{
public int Id {get; set;}
public string StreetAddress1 {get; set;}
...
public Customer Customer {get; set;}
}