我如何模拟/伪造:多对多的对象

时间:2010-01-12 01:40:11

标签: c# tdd mocking domain-driven-design

所以在我的域名中我有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(不确定正确的术语)。起初我试图创建一些假对象但是有很多对象似乎很多工作。

提前致谢

3 个答案:

答案 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的文章:

http://martinfowler.com/articles/mocksArentStubs.html

答案 1 :(得分:0)

我不确定我是否完全理解了你的问题。我认为你是在引用模拟/测试数据而不是TDD框架/方法?

如果是这样,我建议你以半自动的方式进行。

由于Tag可以与User和Item相关联,因此以编程方式创建它们的池(随机字符串或来自一组关键字)。

接下来是项目。创建一个链接到0(或1?)到N标签的池。您可能需要为变体添加一些随机元素或模式。

最后,创建用户列表。将它们链接到项目和标签,类似于您为项目执行的操作。

根据您的域模型,您可能还想创建孤立的项目和标签。

答案 2 :(得分:0)

用户,项目和标签看起来不像对象,它们看起来像结构,所以我只是在这里使用真正的数据对象而不是模拟。当模拟用于隔离行为(要求合作对象为您做某事)时,模拟效果会更好。试试Rebecca Wirf-Brocks关于对象设计的书。