代码之家  ›  专栏  ›  技术社区  ›  Robert Koritnik

如何在实体框架中使用Pex和Moles库?

  •  15
  • Robert Koritnik  · 技术社区  · 14 年前

    这是一个艰难的时刻

    数据 只有一个实体的非常简单的模型的项目( DBItem DBRepository GetItems() BLItem )与此类似(简化示例):

    public IList<BLItem> GetItems()
    {
        using (var ctx = new EFContext("name=MyWebConfigConnectionName"))
        {
            DateTime limit = DateTime.Today.AddDays(-10);
            IList<DBItem> result = ctx.Items.Where(i => i.Changed > limit).ToList();
            return result.ConvertAll(i => i.ToBusinessObject());
        }
    }
    

    现在我想为这个方法创建一些单元测试。我在用 Pex和Moles . 我为EF对象上下文创建了mole和stub。

    我想编写parametrised unit test(我知道我首先编写了生产代码,但我不得不这样做,因为我正在测试Pex&Moles)来测试这个方法是否返回有效的项列表。

    [PexClass]
    public class RepoTest
    {
        [PexMethod]
        public void GetItemsTest(ObjectSet<DBItem> items)
        {
            MEFContext.ConstructorString = (@this, name) => {
                 var mole = new SEFContext();
            };
    
            DBRepository repo = new DBRepository();
            IList<BLItem> result = repo.GetItems();
    
            IList<DBItem> manual = items.Where(i => i.Changed > DateTime.Today.AddDays(-10));
    
            if (result.Count != manual.Count)
            {
                throw new Exception();
            }
        }
    }
    

    然后我就跑 Pex探索 . Pex通过提供 null 本试验方法(所以 items = null ). 这是Pex正在运行的代码:

    [Test]
    [PexGeneratedBy(typeof(RepoTest))]
    [Ignore("the test state was: path bounds exceeded")]
    public void DBRepository_GetTasks22301()
    {
        this.GetItemsTest((ObjectSet<DBItem>)null);
    }
    

    对于这些输入,测试用例运行的时间太长,Pex停止了分析。请注意:方法遗忘数据试验.存储库.TaskRepositoryTest.b_u0被调用了50次;请检查代码是否卡在无限循环或递归中。否则,单击“设置MaxStack=200”,然后再次运行Pex。

    更新属性[PexMethod(MaxStack=200)]

    问题

    我想我应该给Pex设置一些限制,它应该为这个特殊的测试方法提供多少项。

    3 回复  |  直到 14 年前
        1
  •  5
  •   Tonderum Conundrum    14 年前

    Moles不是为测试应用程序中具有外部依赖性的部分而设计的(例如,文件访问、网络访问、数据库访问等)。相反,Moles允许您模拟应用程序的这些部分,这样您就可以对没有外部依赖的部分进行真正的单元测试。

    因此,我认为您应该模拟EF对象和查询,例如,通过创建内存中的列表,并让查询方法基于任何相关条件从这些列表返回假数据。

        2
  •  0
  •   John Nicholas    14 年前

    我刚开始和佩克斯打交道。。。我的问题围绕着我想用moq;)

    不管怎样。。。

    我有一些和你的方法相似的方法也有同样的问题。当我增加最大值时,它们就消失了。据推测,pex很满意它已经对分支进行了充分的探索。我有一些方法,我不得不增加代码契约验证的超时时间。

    但有一件事你应该做的是把所有依赖对象作为参数传入。。。不要在方法中实例化repo,而是传递它。

    您遇到的一个普遍问题是在方法中实例化大对象。我在我的DAL类中也做了同样的事情,但是我并没有试图单独对它们进行单元测试。我建立了数据集,并用它来测试我的数据访问代码。

    我在我的业务逻辑和对象上使用pex。

        3
  •  0
  •   Ricardo Rodrigues    14 年前