所以在我的域名中我有3个对象。用户,项目和标签。每个用户都有项目和标签,每个项目都有标签,每个标签都有项目。
对象看起来有点像这样:
public class User
{
public List<Item> Items { get; set; }
public List<Tag> Tags { get; set; }
}
public class Item
{
public List<Tag> Tags { get; set; }
}
public class Tag
{
public List<Item> Items { get; set;}
}
这是我第一次使用TDD,所以我想知道如何在测试中使用mocks / fakes(不确定正确的术语)。起初我试图创建一些假对象但是有很多对象似乎很多工作。
提前致谢
答案 0 :(得分:1)
通常,您将为所有使用Mock框架的接口创建一个接口:
public interface IUser
{
List<Item> Items { get; set; }
List<Tag> Tags { get; set; }
}
public interface IItem
{
List<Tag> Tags { get; set; }
}
public interface ITag
{
List<Item> Items { get; set;}
}
例如,如果你使用的是NMock,你会这样:
IUser user = mockery.NewMock<IUser>();
var testTags = new List<ITag.();
user.Expect().Once.On("Tags").Will(Return.Value(testTags));
此技术允许您切割组件并放置模拟对象并将其用于测试。此外,模拟框架将创建非常方便的接口的临时实现。
与往常一样,当你开始使用TDD和嘲笑时,你必须阅读这篇Martin Fowler的文章:
答案 1 :(得分:0)
我不确定我是否完全理解了你的问题。我认为你是在引用模拟/测试数据而不是TDD框架/方法?
如果是这样,我建议你以半自动的方式进行。
由于Tag可以与User和Item相关联,因此以编程方式创建它们的池(随机字符串或来自一组关键字)。
接下来是项目。创建一个链接到0(或1?)到N标签的池。您可能需要为变体添加一些随机元素或模式。
最后,创建用户列表。将它们链接到项目和标签,类似于您为项目执行的操作。
根据您的域模型,您可能还想创建孤立的项目和标签。
答案 2 :(得分:0)
用户,项目和标签看起来不像对象,它们看起来像结构,所以我只是在这里使用真正的数据对象而不是模拟。当模拟用于隔离行为(要求合作对象为您做某事)时,模拟效果会更好。试试Rebecca Wirf-Brocks关于对象设计的书。