xUnit - 在测试中提取和实现接口
xUnit - Extracting and Implementing Interfaces on Tests
上下文
我刚刚遇到一个场景,我有多个 UnitTests
足够相似,几乎可以用 ctrl-c ctrl-v
方式处理。例如,当断言 AutoMapper
及其 Profiles
有效时。
问题
所以我一直在想 从这些测试中提取接口并在我需要测试属于同样的目的.
代码片段
例如,对于以下测试:
[Fact]
public void ConfigurationValid()
{
throw new System.NotImplementedException();
}
[Fact]
public void FromCreate()
{
throw new System.NotImplementedException();
}
[Fact]
public void FromEdit()
{
throw new System.NotImplementedException();
}
[Fact]
public void ToDetail()
{
throw new System.NotImplementedException();
}
[Fact]
public void ToList()
{
throw new System.NotImplementedException();
}
[Fact]
public void ToList_Many()
{
throw new System.NotImplementedException();
}
可以提取到如下界面:
public interface IViewModelsTests
{
void ConfigurationValid();
void FromCreate();
void FromEdit();
void ToDetail();
void ToList();
void ToList_Many();
}
每当我创建一个新的 ViewModel 并希望对其进行单元测试时,我只需在我的新 TestClass 上实现该接口并让它覆盖所有默认场景。而且我仍然可以在需要时灵活地添加新测试以涵盖每个 ViewModel 的非常具体的场景。
如果它们足够相似,那么从基础 class 到 运行 这些测试中派生出来就不会很糟糕了。然后将功能编写一次并添加到所有实现中。
注意不要让它们太复杂,或者有多层继承。这可能会导致非常难读的测试和不可维护的代码。
上下文
我刚刚遇到一个场景,我有多个 UnitTests
足够相似,几乎可以用 ctrl-c ctrl-v
方式处理。例如,当断言 AutoMapper
及其 Profiles
有效时。
问题
所以我一直在想 从这些测试中提取接口并在我需要测试属于同样的目的.
代码片段
例如,对于以下测试:
[Fact]
public void ConfigurationValid()
{
throw new System.NotImplementedException();
}
[Fact]
public void FromCreate()
{
throw new System.NotImplementedException();
}
[Fact]
public void FromEdit()
{
throw new System.NotImplementedException();
}
[Fact]
public void ToDetail()
{
throw new System.NotImplementedException();
}
[Fact]
public void ToList()
{
throw new System.NotImplementedException();
}
[Fact]
public void ToList_Many()
{
throw new System.NotImplementedException();
}
可以提取到如下界面:
public interface IViewModelsTests
{
void ConfigurationValid();
void FromCreate();
void FromEdit();
void ToDetail();
void ToList();
void ToList_Many();
}
每当我创建一个新的 ViewModel 并希望对其进行单元测试时,我只需在我的新 TestClass 上实现该接口并让它覆盖所有默认场景。而且我仍然可以在需要时灵活地添加新测试以涵盖每个 ViewModel 的非常具体的场景。
如果它们足够相似,那么从基础 class 到 运行 这些测试中派生出来就不会很糟糕了。然后将功能编写一次并添加到所有实现中。
注意不要让它们太复杂,或者有多层继承。这可能会导致非常难读的测试和不可维护的代码。