我有一个使用里面的代理类来调用提供数据的服务的类。当然如果这个方法在里面创建代理,那么测试这个类是有问题的。你认为代理应该在构造函数中给出,即使它可以在没有“知道”的情况下创建吗?构建一个可以测试的类
0
A
回答
1
您应该通过依赖注入(构造函数,属性,参数)向类提供类依赖关系。这使得你的类可测试,并允许模拟所有这些依赖关系。
UPDATE: 进样服务代理:
class Foo
{
private IServiceProxy _serviceProxy;
public Foo(IServiceProxy _serviceProxy)
{
_serviceProxy = serviceProxy;
}
public void Bar()
{
var staff = _serviceProxy.GetStaff();
}
}
顺便说一句考虑隐瞒从你的类代理信息。例如。通过代理实现与实际服务相同的接口并为您的课程提供IService。
UPDATE2(网关):
我们所有的域名需要 - 获得一些工作人员。所以,我们定义接口:
interface IStaffService
{
Staff GetStaff();
}
我们的领域类(您的测试类只使用这个接口,并且不依赖于Web服务,代理创作和其他基础设施问题)。
下一页为您服务创建网关(见Martin Fowler的网站定义):
public MyServiceProxyGateway : IStaffService
{
public Staff GetStaff()
{
var proxy = new YourProxyType();
proxy.X = value;
proxy.Y = value;
var response = proxy.CallActualServiceMethod();
Staff staff = new Staff();
staff.Value = response.Something;
return staff;
}
}
现在您的代码完全不知道这一切的基础设施的通信。你使用方便的接口GetStaff而不是CallActualServiceMethod。
1
那么,“代理类知道如何实例化自己”和“类知道如何实例化代理类”之间有区别。第二,如果你把这些知识包装在内部,单元测试就会变得更加困难(如果不是不可能的话)。我想使用依赖注入(通过框架,构造函数或属性)将这些知识传递给调用者 - 并使其成为可测试的。
1
为了测试我的代理类,我通常给出了应该在构造函数中被代理的目标。可以给我一个存根对象进行测试的可能性。
public class MyProxy : IProxiedInterface
{
private IProxiedInterface _Target;
public MyProxy(IProxiedInterface target)
{
if(target == null)
throw new ArgumentNullException("target");
_Target = target;
}
// ToDo: Implement all functions from IProxiedInterface
// and delegate them to the target
public bool DoSomething()
{
return _Target.DoSomething();
}
}
相关问题
- 1. 构建一个更可测试的会话管理器
- 2. 是否可以使用单个测试测试多个类
- 3. 测试类只能有一个构造
- 4. 是否可以编写一个可以测试AuthorizationPolicy对象的测试?
- 5. 重构静态类,所以我可以单元测试它
- 6. 为Java创建一个测试器类
- 7. 测试一个类可序列化
- 8. 制作一个类可测试
- 9. 构建Gson的一个实例,可以使子类充气
- 10. 您可以在WPF中构建一个类似Visual Studio的DockPanel
- 11. 测试表格symfony中,以构建
- 12. 我可以为django测试建立一个数据库吗?
- 13. 创建一个新的线程错误“类测试构造测试不能被应用到给定类型”
- 14. 测试一个构造函数实例化另一个类
- 15. 无法添加构建以测试内部测试器
- 16. 将可测试测试集成到Maven构建周期
- 17. 我可以为外部服务(iPhone)构建单元测试吗?
- 18. 如何重构类,以便可测试没有反射
- 19. 一个结构体可以在类内部创建吗?
- 20. JQuery可以构建类似DevExpress的UI
- 21. 创建一个测试集线器,以便用户可以触发并观察运行的Selenium RC测试
- 22. 何处移动构建一次性依赖关系以提高可测试性?
- 23. 你可以调试在IntelliJ sbt构建
- 24. 我可以创建一个构造方法的对象,当我创建C#类
- 25. 测试类可以有属性吗?
- 26. 我可以创建一个类似不可变(float)的类吗?
- 27. 写一个测试,以找到一个类
- 28. iOS测试飞行内部测试 - 添加第二个构建?
- 29. 可能有一个jenkins构建失败测试,但不会失败整个构建?
- 30. 是否可以使用Microsoft.VisualStudio.TestTools.LoadTesting.LoadTest类创建压力测试?
逻辑,但你说如果一个类使用某种代理它可靠,所以它应该被注入? – guyl 2012-03-27 08:38:20
当然,你的测试中不应该有任何真实的代码(除了测试对象)。因为当测试失败时,您将无法分辨出您的班级故障或者服务代理中的某些内容。当然,考虑环境问题 - 处理网络和数据库不是你想测试的东西:)如果你想测试代理,写它的集成测试。 – 2012-03-27 08:46:13
请解释“Btw考虑隐藏你的类的代理信息的含义,例如通过代理实现相同的接口来实现实际服务,并为你的类提供IService。”我无法理解 – guyl 2012-03-27 08:52:11