【发布时间】:2012-12-27 23:10:34
【问题描述】:
在我的项目中,我使用的是:SL5+ MVVM+ Prism + WCF + Rx + Moq + Silverlight 单元测试框架。
我是单元测试的新手,最近开始研究 DI、模式 (MVVM) 等。因此,以下代码有很大的改进空间(如果你这么认为,请随意拒绝我采用的整个方法)。
为了访问我的 WCF 服务,我创建了一个如下所示的工厂类(同样,它可能存在缺陷,但请看一看):
namespace SomeSolution
{
public class ServiceClientFactory:IServiceClientFactory
{
public CourseServiceClient GetCourseServiceClient()
{
var client = new CourseServiceClient();
client.ChannelFactory.Faulted += (s, e) => client.Abort();
if(client.State== CommunicationState.Closed){client.InnerChannel.Open();}
return client;
}
public ConfigServiceClient GetConfigServiceClient()
{
var client = new ConfigServiceClient();
client.ChannelFactory.Faulted += (s, e) => client.Abort();
if (client.State == CommunicationState.Closed) { client.InnerChannel.Open(); }
return client;
}
public ContactServiceClient GetContactServiceClient()
{
var client = new ContactServiceClient();
client.ChannelFactory.Faulted += (s, e) => client.Abort();
if (client.State == CommunicationState.Closed) { client.InnerChannel.Open(); }
return client;
}
}
}
它实现了一个简单的接口如下:
public interface IServiceClientFactory
{
CourseServiceClient GetCourseServiceClient();
ConfigServiceClient GetConfigServiceClient();
ContactServiceClient GetContactServiceClient();
}
在我的虚拟机中,我正在执行上述类的 DI 并使用 Rx 调用 WCF,如下所示:
var client = _serviceClientFactory.GetContactServiceClient();
try
{
IObservable<IEvent<GetContactByIdCompletedEventArgs>> observable =
Observable.FromEvent<GetContactByIdCompletedEventArgs>(client, "GetContactByIdCompleted").Take(1);
observable.Subscribe(
e =>
{
if (e.EventArgs.Error == null)
{
//some code here that needs to be unit-tested
}
},
ex =>
{
_errorLogger.ProcessError(GetType().Name, MethodBase.GetCurrentMethod().Name, ErrorSource.Observable, "", -1, ex);
}
);
client.GetContactByIdAsync(contactid, UserInformation.SecurityToken);
}
catch (Exception ex)
{
_errorLogger.ProcessError(GetType().Name, MethodBase.GetCurrentMethod().Name, ErrorSource.Code, "", -1, ex);
}
现在我想构建单元测试(是的,它不是 TDD)。但我不明白从哪里开始。使用 Moq 我无法模拟 BlahServiceClient。也没有 svcutil 生成的接口可以提供帮助,因为异步方法不是自动生成的 IBlahService 接口的一部分。我可能更喜欢扩展(通过部分类等)任何自动生成的类,但我不愿意选择手动构建 svcutil 可以生成的所有代码(坦率地说,考虑到时间和预算)。
有人可以帮忙吗?任何指向正确方向的指针都会对我有很大帮助。
【问题讨论】:
-
"//这里有些代码需要进行单元测试" - 什么样的代码?因为我认为你在测试错误的东西。如果您想对代码进行单元测试,请在没有 WCF 和所有服务基础架构的隔离场景中对其进行测试。
-
这是非常真实的迈克尔。我应该重构我的代码以将其他逻辑与 WCF 调用隔离开来。非常感谢。
-
@user697942 这里没有太多需要重构的地方。只需将您的“一些代码”放入它自己的方法中并测试该方法。那么就不需要测试 WCF 的东西了。
-
@Michal,就我而言,我刚刚完成了创建服务。我们希望单元测试来确保通过 wsdl 进行调用总是有效的,所以我们需要一些测试。所以我正在尝试对我的服务方法进行单元测试……就好像我是一个使用 Web 服务的客户一样。所以我的意图是调用 WSDL 中指定的方法作为我的 Web 服务的假设客户端/消费者。现在另一方面,我可能还想在我的服务项目本身中创建单元测试来测试方法?不确定要单元测试什么。
-
client.ChannelFactory 在做什么?
标签: wcf unit-testing asynchronous moq system.reactive