Feature文件中的Step都是自然语言描述的文本,当然,Step中的参数在Feature文件中也是文本,但是你可能注意到我们在StepDefintion中的第一个Given的参数为整型int
[Given("I have entered (.*) into the calculator")]
public void GivenIHaveEnteredSomethingIntoTheCalculator(int number)
{
calculator.EnterNumber(number);
}
目前我们接触的所有的StepDefinition参数,都可以作为string类型传入StepDefinition。因此,我们可以把上面的代码改为
[Given("I have entered (.*) into the calculator")]
public void GivenIHaveEnteredSomethingIntoTheCalculator(string number)
{
// 由于calculator.EnterNumber(int) 需要一个int参数,我们需要把string转为int
int num = int.Parse(number);
calculator.EnterNumber(num);
}
理论上,Step的参数都是以字符串传入StepDefinition函数的,之所以可以把函数的参数写作int,是因为Specflow帮我们做了类型转换,当发现Step的参数为字符串"50",而StepDefintion的参数为整型,Specflow就会做类型转换。但这些类型转换仅限于C#中的原始类型。例如string=>int , string=>double等。假如StepDefinition的参数是一个自定义的类型,Specflow就不知道如何把string转换为该类型,就会抛出异常。要想做这种转换,需要你把类型转换的方法告诉Specflow(具体实现方法,将在以后说明)。
既然我们已经知道,Step中的50为一个整型数字,可以在StepDefintion的正则表达式中做一个限定
Given I have entered 50 into the calculator
将(.*)改为(/d+),表示该Step参数必须为一个至少1位的数字