2011-09-22 77 views
1

我有一个WCF服务,我在其中一个应用程序中使用。一切正常,但我试图创建一些具有相同API的测试类,但是避免到服务器去获取他们的信息。例如:覆盖WCF客户端方法

// Goes to the server to get a list of names. It might be a while. 
MyClient client = new MyClient(); 
string[] theNames = client.GetSpitefulUsers(); 
... 

// This is what I would use in a test case... 
public FakeClient : MyClient 
{ 
    ... 
    public override string[] GetSpitefulUsers() 
    { 
    // This returns almost immediately, but I can't just override it because the 
    // 'MyClient' definition is generated code. 
    return new string[] {"Aldo", "Barry", "Cassie"}; 
    } 
} 

那么,什么是提供这种类型的功能,而不必求助于聪明的黑客,嘲讽图书馆等最简单的方法?

+2

查找依赖注入/控制 – Dave

+1

的反转?这正是他们想要的。学习使用库比在每个测试用例中手工编写假对象更容易。 –

+0

@Dave非常感谢您的模糊评论。 –

回答

1

WCF服务引用有一个接口,所以你所有的逻辑都应该引用那个接口,而不是服务客户端。在这种情况下,您将能够选择传递给您的应用程序逻辑的实现(真实或假冒)。

比方说,你的WCF服务接口是这样的:

public interface IWcfInterface { 
    string[] GetTheNames(); 
} 

您的应用程序逻辑类的样子:

public class ApplicationLogic { 

    public IWcfInterface WcfInterface {get;set;} 

    public SomeLogic() { 
     WcfInterface.GetTheNames(); 
    } 
} 

所以,如果你需要真正的实现,你只需将它传递给WcfInterface财产你的应用程序逻辑(通常是依赖注入容器)。

假的实施也将看起来很简单:你为什么要避免嘲讽库

public FakeImplementation : IWcfInterface { 
    public string[] GetTheNames() { 
     return new string[] { "foo", "bar" }; 
    } 
} 
+0

我想它并不真正处理重写,但这是迄今为止建议的最简单的解决方案。由于某种原因,我忘记了接口部分的所有内容.... –

0

如果我是正确的,编译器会建议使用关键字new来代替。

http://msdn.microsoft.com/en-us/library/435f1dw2.aspx

这msdnpage将解释如何使用它。

public class BaseC 
{ 
    public int x; 
    public void Invoke() { } 
} 
public class DerivedC : BaseC 
{ 
    new public void Invoke() { } 
} 
+1

是的,'新'技术上可行,但不会像正确的覆盖一样运作。 –