D-02-验证结果 ? ExpectedObjects

如何验证结果

在学会如何Mock介面後,接下来处理的问题就是复杂的类别要怎麽来验证,当然可以透过JSON的序列化及反序列化来验证结果对不对,但是如果关注的点是只有特殊的几个属性呢,所以今天介绍ExpectedObjects来使得验证结果不是一件难事。

本文同步放置於此

验证结果

「前辈,我要如何处理复杂型别的验证阿。」
在了解BDD之後并开始写测试案例以及处理模拟资料後小光又遇上一个问题,就是复杂型别的验证。
「恩我遇到的问题试不知道该如何验证返还资料试阵列的方法。」
听到大头这麽说,小光做动作示意是不是该去找老K了解一下这部分有甚麽方法可以处理,这时大头也点点头,但是在这同时老K也从远方走了过来。
「我在想阿,你们是不是应该遇到该如何处理验证的动作了阿。」
这时大头跟小光互看一眼并且对着彼此笑了起来。
「那我们就从基础开始介绍如何处理验证资料吧。」

Assert

首先介绍的是,Microsoft.VisualStudio.TestTools.UnitTesting中的Assert,这是最基本的验证工具可以做一些简单的验证。其验证的方法如下。

var actual = _current.Get<int>("Result");
Assert.AreEqual(expected, actual);

基本上可以透过这个来做简单的验证,而且只能验证基础型别,所以我们继续往下看,不过想要了解有哪些方法可以用可以参考C#,又来找你玩了! - MSTest 的 Assert 提供了哪些 method?

TechTalk.SpecFlow.Assist

原则上基础的型别我们透过Assert可以验证,所以接下来我们来处理类别class的验证,这边我们使用specflow的元件来验证,首先我们可以在feature内这样写。

Then the result should be
| Name | Age |
| 大头 |  20 |

然後要处理这类强行别的验证则使用下列语法。

[Then("the result should be")]
public void ThenTheResultShouldBe(Table expect)
{
    var actual = _scenarioContext.Get<UserInfo>("Result");
    expect.CompareToInstance(actual);
}

如果说今天要验证的资料是阵列的话,我们的测试案例调整如下。

Then the result should be
| Name | Age |
| 大头 |  20 |
| 小光 |  15 |
| 老K  |  40 |

然後要处理验证则使用下列语法。

[Then("the result should be")]
public void ThenTheResultShouldBe(Table expect)
{
    var actual = _scenarioContext.Get<UserInfo>("Result");
    expect.CompareToSet(actual);
}

所以针对强行别的验证就是在feature传入Table,然後在程序码里面用CompareToInstance或是CompareToSet来验证。不过这边的物件是会比较所有的变数,如果只针对物件的特定变数则要使用下面的套件。

ExpectedObjects

接下来要介绍这个套件可以更进一步验证物件的某些属性,所以首先先安装该套件进来。

dotnet add package ExpectedObjects

接下来延续上述的例子,我们可以将程序码改成下列内容。

[Then("the result should be")]
public void ThenTheResultShouldBe(Table expect)
{
    var actual = _scenarioContext.Get<UserInfo>("Result");
    expect.CreateInstance<UserInfo>().ToExpectedObject().ShouldEqual(actual);
}

如此就算是某属性错误时错误讯息也会特别说明是哪个属性不同,当然他也可以用在阵列上,如下所示。

[Then("the result should be")]
public void ThenTheResultShouldBe(Table expect)
{
    var actual = _scenarioContext.Get<UserInfo>("Result");
    expect.CreateSet<UserInfo>().ToExpectedObject().ShouldEqual(actual);
}

当然他的功用并不只这样,他还可以使用ShouldMatch方法针对部分属性做验证,或者是忽略某些特定属性,如下所示。

[Then("the result should be")]
public void ThenTheResultShouldBe(Table expect)
{
    var actual = _scenarioContext.Get<UserInfo>("Result");
    expect.CreateSet<UserInfo>().ToExpectedObject(ctx => ctx.Ignore(x => x.Name)).ShouldEqual(actual);
}

後记

今天跟着大头还有小光学习到如何处理在BDD中的最後一个步骤,也就是如何验证预期与实际是否相符,并且了解在Specflow中检查强行别的类别资料是否正确,最後使用ExpectedObjects来针对部分属性做验证。


<<:  [Day 28] - React 前端串後端 - Donate!

>>:  [DAY-29] 零规则的带脑去上班

2020it邦铁人赛-30天手把手的Vue.js教学 Day28 - 关心时事! 做个简单的COVID-19追踪app吧!(上)

tags: Vue.js ItIron2020 前言 终於进到最终的三天了,坦白说做为一个教学的系列...

Day 26. 双向绑定语法糖 - v-model

表单输入绑定 我们可以用v-model指令在表单<input>、<textarea...

团队文化

谈完「人」之後,我们来谈另一个跟人很高度相关的题目:文化。 我大学时,曾经在一家加拿大的新创实习。...

企划实现(13)

GOOGLE登入 第一步:在firebase添加一个新的专案 第二步:选取android专案 第三步...

DAY2 - 找寻生活中的问题

好了,开始做side project了,但是要做什麽呢? 相信这是大多数人的问题 做 side pr...