这是困难的一个 因为没有太多的人使用PEX和痣,所以我认为(即使PEX是一个非常好的产品 - 比任何其他单位测试工具都要好得多)

我有一个 数据 一个只有一个实体的项目,它具有非常简单的模型(DBItem)。我也写了 DBRepository 在该项目中,操纵该EF模型。存储库有一种称为的方法 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和痣. 。我为我的EF对象上下文创建了痣和存根。

我想编写参数化的单元测试(我知道我已经首次编写了生产代码,但是我必须,因为我正在测试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提供的其他评论:

这些输入的测试用例太长了,PEX停止了分析。请注意:方法oblevious.data.test.repositories.taskrepositorytest.b__0被称为50次;请检查代码不会粘在无限的循环或递归中。否则,请单击“设置MaxStack = 200”,然后再次运行PEX。

更新属性[PEXMETHOD(MAXSTACK = 200)

问题

我是否以正确的方式这样做?我应该使用efcontext存根吗?我是否必须将其他属性添加到测试方法中,以便将摩尔主机运行(我不确定现在确实可以)。我只运行PEX和痣。没有VS测试,Nunit或其他任何东西。

我想我可能应该为PEX设定一定的限制,该项目应该为此特定的测试方法提供多少项目。

有帮助吗?

解决方案

摩尔数不是为了测试具有外部依赖项的应用程序的部分(例如文件访问,网络访问,数据库访问等)。取而代之的是,moles允许您模拟应用程序的这些部分,因此您可以对没有外部依赖的零件进行真实的单元测试。

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

其他提示

我也只是与pex握住...我的问题包围我想与掉量一起使用它;)

反正 ...

我有一些与您相似的方法,这些方法也有相同的问题。当我增加最大值时,他们消失了。据推测,PEX感到满意,因为它已经充分探索了分支。我有一些方法,我还必须增加代码合同验证的超时。

尽管您应该成为参数的所有因对象,但您可能应该是toign的一件事...即不要在方法中实例化存储库,而是将其传递给。

您遇到的一个总体问题是,您正在实例化方法中的大对象。我在DAL课程中也做同样的事情,但是我不会尝试隔离单元测试它们。我构建数据集并使用它来测试我的数据访问代码相反。

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

如果我试图测试我的DAL代码ID必须使用IOC将数据可将数据传递到方法中 - 然后,这将使测试成为可能,因为您可以模拟数据上下文。

您应该使用实体框架存储库模式: http://www.codeproject.com/kb/database/implrepositorypatternef.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top