当我创建测试时:
[TestCase(123, "http://www.example.com/123")]
public void Foo(int clientId, string expectedUrl)
{
string url = GetUrl(clientId);
Assert.That(url, Is.EqualTo(expectedUrl));
}
我通常喜欢提取输入和预期结果中的共同元素。特别是如果我对多个测试使用相同的默认值。例如,我喜欢做这样的事情:
private int DefaultClientId = 123;
[TestCase(DefaultClientId , $"http://www.example.com/{DefaultClientId}")]
public void Foo(int clientId, string expectedUrl)
{
string url = GetUrl(clientId);
Assert.That(url, Is.EqualTo(expectedUrl));
}
但是,如果不使用
TestCaseSource
,这是不可能的,这使得简单情况下的事情变得更加丑陋。我发现的(甚至更丑陋?)解决方案是声明一个具有“相同”内容的字符串变量:
private int DefaultClientId = 123;
private string DefaultClientIdValue = "123";
[TestCase(DefaultClientId , "http://www.example.com/" + DefaultClientIdValue)]
public void Foo(int clientId, string expectedUrl)
{
string url = GetUrl(clientId);
Assert.That(url, Is.EqualTo(expectedUrl));
}
解决此问题的另一种选择是在函数内进行字符串插值:
private int DefaultClientId = 123;
[TestCase(DefaultClientId , "http://www.example.com/")]
public void Foo(int clientId, string protoExpectedUrl)
{
var expectedUrl = protoExpectedUrl + DefaultClientId;
string url = GetUrl(clientId);
Assert.That(url, Is.EqualTo(expectedUrl));
}
但是如果我正在测试几个不同的测试用例并且每个测试用例都会生成不同的 url,那么这是不可能的。
有没有办法优雅地处理这个“问题”?
将默认 id 设置为常量:
private const int DefaultClientId = 123;