假设我有这样一个域对象:
public class Customer
{
private Guid _id;
private string _name;
private Address _address;
public Customer (Guid id, string name, Address address)
{
if (id == Guid.Empty)
throw new ArgumentException();
if (name == "")
throw new ArgumentException();
if (address == null)
throw new ArgumentException();
_id = id;
_address = address;
_name= name;
}
}我想创建一些Specflow场景来测试这一点。到目前为止,我已经完成了(功能文件中的Specflow场景):
Given a name of Bert and an address of 1 The street, London, Greater London, L1 234 这个Specflow场景在我看来还不错,但是我意识到我遗漏了ID。ID是在测试方法中创建的。我是否应该这样做(特性文件中的specflow场景):
Given a name of Bert and an address of 1 The street, London, Greater London, L1 234 and an id of 111-11-1111-11第一种方法(没有ID)在我看来是正确的。我就在这儿吗?如果使用第一种方法,那么如何创建测试空ID的场景?
我在网上看到的每一个例子都显示了如何将Specflow应用于一个简单的计算器或游戏。这些类中没有一个具有或需要ID。
发布于 2018-03-02 15:09:01
我可能误解了“域对象”是什么,但我假设它是某种实体,即应用程序模型中持久化到数据库的部分。假设这是正确的,那么它就是一个实现细节。
Specflow是用于测试需求/用户故事的工具。因此,Specflow不应该直接用于测试实现细节。
然后,它就变成了是否与客户共享客户ID的案例,例如电子邮件、订单等。如果是的话,那么合理地假设您有需求,从而实现了Specflow场景,即根据ID或地址处理定位客户。但是,如果有这样一个要求,那就是找到客户的唯一方法就是搜索他们的姓名、地址和ID,这将是相当奇怪的。
但是,如果这个ID从来没有向客户公开过,那么您就没有对它的需求,因此它将不受Specflow的关注。
不管怎样,有一件事是肯定的: Specflow绝对不应该被用来测试一个空的ID。
发布于 2018-03-02 13:24:53
我认为,作为一种规则,您希望在附带的实现细节和与测试场景相关的信号之间保持逻辑上的分离。
在你的例子中,姓名和地址是你所关心的,但任何身份证明都是令人满意的。因此,我希望您的场景描述名称和地址,并让实现提供它喜欢的任何id。
看见
发布于 2018-03-02 12:07:35
我会将域对象更改为如下:
public class Customer
{
public Guid Id;
public string Name;
public Address Address;
public Customer ()
{
this.Id = Guid.NewGuid();
}
}当您创建一个新客户时,您总是需要一个新的和唯一的id。
如果要从数据库或类似对象反序列化customer对象,则希望能够设置各个字段。
这使您可以选择不担心测试中的Id是什么,并保证Id将始终被填充。
https://softwareengineering.stackexchange.com/questions/366862
复制相似问题