【问题标题】:how to generate fake data using moq for unit test?如何使用最小起订量生成假数据进行单元测试?
【发布时间】:2011-11-16 02:38:04
【问题描述】:

我需要生成一些数据来对我的存储库进行单元测试。我正在使用循环来生成对象列表,请参见下面的代码。我了解到 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>();
}

【问题讨论】:

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


    【解决方案1】:

    您不能使用 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();
    }
    

    这将添加多个父母,每个父母都有多个子。

    【讨论】:

      【解决方案2】:

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

      dotnet 添加包 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();
      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多