1

我有一个像这样的功能文件:

Feature: Viewing revenue

Background:
Given invoices
| Date     | Amount |
| 1/1/2010 | 200    |
| 1/1/2011 | 300    |

Scenario: Total revenue
Then the total revenue is
| Label | Revenue |
|       | $500    |

Scenario: Total revenue by year
When I choose to view it by "Year"
Then the total revenue is
| Label | Revenue |
| 2010  | $200    |
| 2011  | $300    |

我想在每个场景执行后运行一些清理代码。我有一个用 AfterScenario 属性装饰的函数,如下所示:

let [<AfterScenario>] ``Drop Invoices`` () =
  Invoices.removeAll

该函数确实被调用,但只有一次,并且只有当我通过 NUnit 的 gui 运行器重新加载项目时。测试的后续运行,不重新加载项目,不调用该函数。

4

1 回答 1

3

调用Invoices.removeAll似乎缺少参数,您可能需要添加()

TickSpec期望属性方法返回单位,因此您可能需要通过管道将结果忽略。您可以通过将Drop Invoices鼠标悬停在它上面来检查函数的类型,它应该说 unit -> unit,如果它没有尝试这个:

let [<AfterScenario>] ``Drop Invoices`` () =
  Invoices.removeAll () |> ignore

在 2012 年 11 月版本的 TickSpec 之前存在一个问题,如果在场景中执行步骤时引发异常,则不会调用 AfterStep 和 AfterScenario 函数。这已在最新的源代码中修复,并且该程序集可通过CodePlexNuget 获得

如果您有多个标记为 AfterScenario 的函数并且其中任何一个引发异常,则后续的 AfterScenario 方法将不会被调用。理想情况下,您的 BeforeSceanrio 和 AfterScenario 函数不应抛出。

于 2013-02-05T05:29:51.667 回答