如何使用moq生成假数据进行单元测试?

时间:2011-09-13 11:45:34

标签: unit-testing asp.net-mvc-3 moq

我需要生成一些数据来对我的存储库进行单元测试。我正在使用循环生成对象列表,请参阅下面的代码。我学会了moq是一个很棒的模拟库,我可以使用moq来生成它吗?我该怎么做?

public IQueryable<Category> GetCategories()
{
    IList<Category> result = new List<Category>();

    for (int i = 1; i <= 2; i++)
    {
        Category c = new Category();
        c.ID = i;
        c.Name = "Parent" + i.ToString();
        c.ParentID = 0;

        for (int x = i*10; x < i*10+5; x++)
        {
            Category sub = new Category();
            sub.ID = x;
            sub.Name = "Sub" + x.ToString();
            sub.ParentID = i;
            result.Add(sub);
        }

        result.Add(c);
    }

    return result.AsQueryable<Category>();
}

2 个答案:

答案 0 :(得分:6)

您无法使用Moq创建数据,但可以使用AutoFixture

public IQueryable<Category> GetCategories()
{
    return fixture.CreateMany<Category>().AsQueryable();
}

但是,这不会为您提供分层树。它将返回如下对象:

Object 1:
- ID = 0
- ParentID = 1
Object 2:
- ID = 2
- ParentID = 3

如果您确实需要这种分层数据,则需要使用以下代码:

public IQueryable<Category> GetCategories()
{
    var result = new List<Category>();

    // Create the parents
    var parents = fixture.Build<Category>()
                         .Without(x => x.ParentID)
                         .CreateMany());
    result.AddRange(parents);

    result.AddRange(parents.SelectMany(p => fixture.Build<Category>()
                                                   .With(x => x.ParentID, p.ID)
                                                   .CreateMany())); 

    return result.AsQueryable();
}

这将为每个父母添加多个父母和多个子女。

答案 1 :(得分:0)

您可以使用faker.net生成虚假数据。例如:对于dotnet核心项目,它的Faker.NETCore。

  

dotnet add package Faker.NETCore -v 1.0.1

然后以下列方式在代码中使用相同的内容: -

public void GetStudent()
{
   var st = new Student()
   st.FirstName = Faker.Name.First();
   st.LastName = Faker.Name.Last();
   st.Mobile = Faker.Phone.Number();
}