我有SL代码
public void LoadData()
{
MyClient myClient = new MyClient();
myClient.MyMethodCompleted += new EventHandler<MyMethodCompletedEventArgs>(myMethod_MyMethodCompleted);
myClient.MyMethodAsync();
}
然后,完成的方法根据从服务器返回的内容设置属性。
工作正常,但我想对类进行单元测试,属性都是私有的。 我期望按照
的方式做点什么public void LoadData(IMyClient myClient = null)
{
if(myClient == null) {
MyClient myClient = new MyClient();
}
...
并传入一个模拟,但客户端的接口不包含异步方法,只包含原始服务器端非异步方法 即public ReturnType MyMethod();
所以我尝试使用MyClient作为Mock对象的基类
public MyMockClient : MyClient
new public ReturnType MyMethod()
{
...
但基础构造函数会导致各种问题,我不想在测试项目中添加其他服务引用。
我错过了一个技巧,这可以在没有任何第三方模拟工具的情况下完成吗?
答案 0 :(得分:1)
我建议您在类的构造函数中指定MyClient
实例:
public class MyClass
{
private MyClient _client;
public MyClass()
: this(new MyClient())
{ }
public MyClass(MyClient client)
{
_client = client;
_client.MyMethodCompleted += ...
}
public void LoadData
{
_client.MyMethodAsync();
}
}
然后你可以将MyClient子类化(或者更好,重构它以实现一个接口)来实现你的客户端的模拟版本。
回应评论
要在自动生成的WCF客户端类上实现接口,可以使用Partial Classes。例如,假设您的自动生成的客户端在命名空间MyClient
中被称为MyNamespace
,则您的部分类需要如下所示:
namespace MyNamespace
{
public partial class MyClient : IMyClientInterface
{
}
}
假设生成的MyClient
包含IMyClientInterface
上的所有成员,则不需要进一步的代码,您可以在IMyClientInterface
答案 1 :(得分:0)
您可以创建一个您选择的界面,然后创建与MyClient对话的适配器包装器,如下所示:
public interface IClient
{
void Foo();
int Bar();
}
public class MyClientAdapter : IClient
{
private MyClient Client { get; set; }
public MyClientAdapter(MyClient client)
{
Client = client
}
public void Foo()
{
Client.Foo();
}
public int Bar()
{
return Client.Bar();
}
}