2011-12-07 46 views
3

我是Pex和痣的新手。我想在我的代码上运行Pex,但是我使用了构造函数注入。有没有办法指导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和痣

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

+0

显示一些代码,你可以用痣更换任何代码。 – Peter

+0

这不完全正确,有一些情况下你将无法使用痣(例如http://social.msdn.microsoft.com/Forums/en-US/pex/thread/c262d8f1-246e-4157 -a7b4-f7ddeaf1890c /) – Gorgsenegger

+0

还有一件事,我认为如果你有机会从头开始设计你的应用程序,那么只要你正确地接口等,你通常应该对MOQ适用。 痣可以帮助遗留的代码,你可能无法/不允许/ ...改变了。 – Gorgsenegger

回答

1

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

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

我还建议您使用Mole Stub类型来进行单元测试注入。 Microsoft Moles Reference Manual是开始学习如何在单元测试中使用Moles的好地方。当您创建参数化测试时,将为您的界面创建一个摩尔存根类型。只需配置您的存根类型的绕道,然后将其传递给参数化测试。

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

样品枚举:

[Flags()] 
public enum MoleConfigurations 
{ 
    MoleSqlClientObjects, 
    DisableDirectory_Exists, 
    DisableEventLogExtensions, 
    DisableInitializeDatabaseObjects, 
    DisableInitializeThreadingObjects, 
    DisableQueueExistingDataFiles, 
    DisableConstructor 
} 
+0

嗨,迈克。我刚刚阅读了您博客上的pex帖子。感谢您的回应。有可能或者你提供一个快速的例子。我用一个简单的例子更新了我的帖子。 – ministrymason