单元测试WCF对域对象的响应的转换

时间:2012-01-02 11:33:51

标签: c# wcf unit-testing mapping

从WCF服务中我们得到一个具有多个嵌套列表和很多属性(最多5个级别)的退出复杂响应。这个响应不能一对一使用,因此我们构建了将其“翻译”为我们可以在UI中使用的域对象的翻译器。

我们希望对翻译过程进行单元测试,因此我们知道字段之间没有错误映射。目前在我的单元测试中,我正在构建代码中的响应。但是这已经放弃了一些工作,特别是当我需要在不同的响应中使用一些变体来测试不同的流程时。单元测试也变成非常大的文件。 (只建立一个响应可以超过200行)

我一直在考虑一种方法,可以更容易地建立响应并使我的单元测试看起来更干净。

我一直在考虑的一个选项是为每个unittest创建一个带有所需响应的XML文件,将其反序列化为响应并在反序列化对象上进行单元测试。

这种方法的专家是单元测试将变得更小,更容易创建。但更新文件/元素将更难。或者至少这就是我的想法。

任何人都有一些想法或不同选项可以让这个响应变得更容易吗?

3 个答案:

答案 0 :(得分:2)

您可以使用AutoFixture等框架来帮助您创建响应的实例。 AutoFixture将自动设置属性,从而使您的构造代码非常短,并且您可以在需要时覆盖其行为。例如:

var mc = fixture.Build<MyResponseClass>()
   .With(x => x.SomeProperty, "SomeValue")
   .CreateAnonymous();

对于非自定义值,Autofixture使用确定性随机性生成值,这可确保您每次都获得不同的值,但仍将值保持在有效范围内。

答案 1 :(得分:1)

在为请求 - 响应接口编写测试时,应编写测试用例,以便每个案例尽可能测试请求中最小的重要部分。也就是说,每个测试用例应该一次测试请求的一个重要元素。

如果您遵循此模式,您应该能够将每个测试用例标识为以下之一:

核心案例

定义构建其他测试的“基础”的案例。这些都是代表成功请求的成功案例。您可以在单元测试类中定义核心请求,或者如果您有多个核心案例,则从公共基础构建核心案例。在任何一种情况下,这些情况都是你正在做大部分“设置”价值的地方。

偏离案例

通过更改其中一条信息以测试不同的用例来构建核心测试用例的案例。通常这些是你的边缘情况,通常测试预期的失败(即调用者传递不良信息)。

这基本归结为DRY,因为你的核心案例定义了你的测试案例中“常见”的东西,所以你不需要花费200行来设置值。您的大多数测试用例输入应该表示为“与&lt;测试用例&gt; 相同,但使用&lt; deviation&gt; ”,因此您应该这样写。

答案 2 :(得分:0)

我认为Lloyd的意思是你拿走当前的代码,负责构建你的响应对象并将其打包在一个单独的* .dll中,这样它就是一个API或一个库,你可以从你的单元中调用它试验。因此,您的单元测试将变得更加简单。 这种方法的另一个好处是你可以实际构建两个API:一个构造假对象,另一个查询真实服务。使用界面,您可以通过配置设置轻松切换API。 您也可以尝试使用像MoQ或smth这样的模拟框架。如果你的情况有意义的话。

相关问题