CQRS之旅——旅程4(扩展和增强订单和注册限界上下文) (10)

现在看第二个示例,它执行的是相同的测试,但是在本示例中,是通过发送命令来测试的:

public class given_placed_order { ... private EventSourcingTestHelper<Order> sut; public given_placed_order() { this.sut = new EventSourcingTestHelper<Order>(); this.sut.Setup(new OrderCommandHandler(sut.Repository, pricingService.Object)); this.sut.Given( new OrderPlaced { SourceId = OrderId, ConferenceId = ConferenceId, Seats = new[] { new SeatQuantity(SeatTypeId, 5) }, ReservationAutoExpiration = DateTime.UtcNow }); } [Fact] public void when_updating_seats_then_updates_order_with_new_seats() { this.sut.When(new RegisterToConference { ConferenceId = ConferenceId, OrderId = OrderId, Seats = new[] { new SeatQuantity(SeatTypeId, 20) }}); var @event = sut.ThenHasSingle<OrderUpdated>(); Assert.Equal(OrderId, @event.SourceId); Assert.Equal(1, @event.Seats.Count()); Assert.Equal(20, @event.Seats.ElementAt(0).Quantity); } ... }

这个例子使用了一个helper类,它使您能够向Order实例发送命令。现在,阅读测试的人可以明白,当您发送RegisterToConference命令时,您期望看到OrderUpdated事件。

代码理解之旅 乔什·埃尔斯特讲述了一个关于痛苦、解脱和学习的故事

本节描述CQRS咨询委员会成员乔什·埃尔斯在探索Contoso会议管理系统的源代码时所经历的过程。

测试是很重要的

我曾经相信,优秀架构的应用程序很容易理解,不管代码库有多么庞大。每当我理解应用程序行为功能时遇到问题,都是代码的问题,而不是我的问题。

永远不要让你的自负掩盖住常识。

事实上,一直到我职业生涯的某个阶段,我都还没有接触到一个大型的、架构优秀的代码基本。如果不是它走过来打我的脸,我根本就不知道它是什么样子。值得庆幸的是,随着我阅读代码的经验越来越丰富,我学会了区分那些不同。

备注:在任何结构良好的项目中,测试都是开发人员理解项目的基础。各种命名约定,编码风格,设计方法和使用模式的主题都包含在测试套件中,为集成到代码库提供了一个很好的起点。这也是很好的代码专业性实践,熟能生巧!

克隆会议代码之后,我的第一个动作是浏览测试。在阅读了会议系统Visual Studio解决方案中的集成和单元测试套件之后,我将注意力集中在Conference.AcceptanceTests Visual Studio解决方案上,其中包含SpecFlow验收测试。项目团队的其他成员已经对那些.feature文件做了一些初步的工作,由于我不熟悉业务规则的细节,所以对我来说效果很好。把这些feature和代码绑定是一种很好的方式,既可以为项目做出贡献,又可以让人理解系统如何工作。

领域测试

当时我的目标是得到一个像这样的feature文件:

Feature: Self Registrant scenarios for making a Reservation for a Conference site with all Order Items initially available In order to reserve Seats for a conference As an Attendee I want to be able to select an Order Item from one or many of the available Order Items and make a Reservation Background: Given the list of the available Order Items for the CQRS Summit 2012 conference with the slug code SelfRegFull | seat type | rate | quota | | General admission | $199 | 100 | | CQRS Workshop | $500 | 100 | | Additional cocktail party | $50 | 100 | And the selected Order Items | seat type | quantity | | General admission | 1 | | CQRS Workshop | 1 | | Additional cocktail party | 1 | Scenario: All the Order Items are available and all get reserved When the Registrant proceeds to make the Reservation Then the Reservation is confirmed for all the selected Order Items And these Order Items should be reserved | seat type | | General admission | | CQRS Workshop | | Additional cocktail party | And the total should read $749 And the countdown started

并将其绑定到执行操作、创建期望或作出断言的代码:

[Given(@"the '(.*)' site conference")] public void GivenAConferenceNamed(string conference) { ... }

所有这些都位于"UI之下",但是在基础概念之上。测试紧密关注整个解决方案领域的行为,这就是为什么我将这些类型的测试称为领域测试。其他术语,如行为驱动开发(BDD),可以用来描述这种类型的测试。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppzzg.html