3

我是 Pex 和 Moles 的新手。我正在尝试在我的代码上运行 Pex,但我正在使用构造函数注入。有没有办法指导 Pex 如何注入构造函数?

编辑

    public UserLogic(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public int GetUsersAge(int id)
    {
        User user = _userRepository.GetById(id);
        DateTime DOB = user.DOB;
        DateTime now = DateTime.Today;
        int age = now.Year - DOB.Year;
        if (DOB > now.AddYears(-age)) age--;
        return age;
    }

我需要注入一个存根 userRepository。调用 _userRepository.GetById(id) 时,Pex 失败并出现 NullReferenceException。我一直在使用 Moq 进行单元测试,但我想切换到 pex 和 moles

我应该使用 PexFactories 创建我的存根吗?

4

1 回答 1

1

尝试将 Moles Stub 类型传递给 Pex 生成的参数化测试。要创建参数化测试,请右键单击要探索的类,然后选择PEX > Create Parameterized Unit Test。这会在包含参数的测试类中生成一个方法。单独的测试调用这个参数化测试,发送单独的测试参数。

当被测代码通过参数使用依赖注入时(它具有接口类型参数),Pex 生成的参数化测试方法也将包含相同的接口类型参数。您可以编写自己的测试方法,这些方法也调用参数化方法,为其提供您自己的值,包括接口类型。请确保不要将它们写入 Pex 生成的文件中!

我还建议考虑使用 Mole Stub 类型进行单元测试注入。Microsoft Moles 参考手册是开始学习如何在单元测试中使用 Moles 的好地方。当您创建参数化测试时,将为您的接口创建一个 moles 存根类型。只需为您的存根类型配置弯路,然后将其传递给参数化测试。

创建存根类型的弯路非常容易。我建议在测试项目中创建一个配置方法,配置常用的弯路。我通常会在此方法中添加一个枚举标志作为参数,因此我可以很容易地告诉它要在某些类型上创建哪些弯路,所有这些都在一次调用中完成。

示例枚举:

[Flags()]
public enum MoleConfigurations
{
    MoleSqlClientObjects,
    DisableDirectory_Exists,
    DisableEventLogExtensions,
    DisableInitializeDatabaseObjects,
    DisableInitializeThreadingObjects,
    DisableQueueExistingDataFiles,
    DisableConstructor
}
于 2011-12-07T18:48:46.823 回答