- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试创建一种在单元测试中测试字符串参数的简单方法,对于大多数字符串参数,我想检查参数为 Null、Empty 或仅包含空格时的行为。
在大多数情况下,我使用 string.IsNullOrWhiteSpace() 检查参数,如果它具有这三个值之一,则抛出异常。
现在对于单元测试,似乎我必须为每个字符串参数编写三个单元测试。一种用于空值,一种用于空值,一种用于空白。
想象一个有 3 或 4 个字符串参数的方法,那么我需要编写 9 或 12 个单元测试......
谁能想出一个简单的方法来测试这个?也许使用 AutoFixture?
最佳答案
避免duplicating the same test您可以多次写 parameterized test .
如果你使用 xUnit,你会写一个所谓的 theory .理论意味着您正在证明一个原则,即当给定相同类型输入数据的不同样本时,某个函数的行为符合预期。例如:
[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData(" ")]
public void Should_throw_argument_exception_when_input_string_is_invalid(string input)
{
Assert.Throws<ArgumentException>(() => SystemUnderTest.SomeFunction(input));
}
input
[InlineData]
中指定的值之一的参数属性。
null
的字符串即可。 , 空或仅包含空格。
InlineAutoData
属性:
[Theory]
[InlineAutoData(null)]
[InlineAutoData("")]
[InlineAutoData(" ")]
public void Should_throw_argument_exception_when_the_first_input_string_is_invalid(
string input1,
string input2,
string input3)
{
Assert.Throws<ArgumentException>(() =>
SystemUnderTest.SomeFunction(input1, input2, input3));
}
input1
参数将有一个特定的值,而其余的将由 AutoFixture 分配随机字符串。
[InlineAutoData]
传递的值。属性根据它们的位置分配给测试参数。由于我们需要分别测试所有三个参数的相同行为,因此我们必须编写三个测试:
[Theory]
[InlineAutoData(null)]
[InlineAutoData("")]
[InlineAutoData(" ")]
public void Should_throw_argument_exception_when_the_second_input_string_is_invalid(
string input2,
string input1,
string input3)
{
Assert.Throws<ArgumentException>(() =>
SystemUnderTest.SomeFunction(input1, input2, input3));
}
[Theory]
[InlineAutoData(null)]
[InlineAutoData("")]
[InlineAutoData(" ")]
public void Should_throw_argument_exception_when_the_third_input_string_is_invalid(
string input3,
string input1,
string input2)
{
Assert.Throws<ArgumentException>(() =>
SystemUnderTest.SomeFunction(input1, input2, input3));
}
Property-based tests make statements about the output of your code based on the input, and these statements are verified for many different possible inputs.
ArgumentException
只要其中至少一个参数是
null
、空字符串或仅包含空格的字符串。
string
的期望。参数由方法验证并在您的测试中使用它们。
[Theory, AutoData]
public void Should_throw_argument_exception_when_the_input_strings_are_invalid(
ValidatesTheStringArguments assertion)
{
var sut = typeof(SystemUnderTest).GetMethod("SomeMethod");
assertion.Verify(sut);
}
public class ValidatesTheStringArguments : GuardClauseAssertion
{
public ValidatesTheStringArguments(ISpecimenBuilder builder)
: base(
builder,
new CompositeBehaviorExpectation(
new NullReferenceBehaviorExpectation(),
new EmptyStringBehaviorExpectation(),
new WhitespaceOnlyStringBehaviorExpectation()))
{
}
}
public class EmptyStringBehaviorExpectation : IBehaviorExpectation
{
public void Verify(IGuardClauseCommand command)
{
if (!command.RequestedType.IsClass
&& !command.RequestedType.IsInterface)
{
return;
}
try
{
command.Execute(string.Empty);
}
catch (ArgumentException)
{
return;
}
catch (Exception e)
{
throw command.CreateException("empty", e);
}
throw command.CreateException("empty");
}
}
public class WhitespaceOnlyStringBehaviorExpectation : IBehaviorExpectation
{
public void Verify(IGuardClauseCommand command)
{
if (!command.RequestedType.IsClass
&& !command.RequestedType.IsInterface)
{
return;
}
try
{
command.Execute(" ");
}
catch (ArgumentException)
{
return;
}
catch (Exception e)
{
throw command.CreateException("whitespace", e);
}
throw command.CreateException("whitespace");
}
}
NullReferenceBehaviorExpectation
中表达的期望,
EmptyStringBehaviorExpectation
, 和
WhitespaceOnlyStringBehaviorExpectation
AutoFixture 将自动尝试调用名为
"SomeMethod"
的方法。与
null
, 分别为空字符串和空格。
catch
中所述阻止在期望类中——然后 AutoFixture 本身会抛出一个异常来解释发生了什么。下面是一个例子:
An attempt was made to assign the value whitespace to the parameter "p1" of the method "SomeMethod", and no Guard Clause prevented this. Are you missing a Guard Clause?
[Fact]
public void Should_throw_argument_exception_when_the_input_strings_are_invalid()
{
var assertion = new ValidatesTheStringArguments(new Fixture());
var sut = typeof(SystemUnderTest).GetMethod("SomeMethod");
assertion.Verify(sut);
}
关于C# 如何使用 AutoFixture 简化单元测试字符串参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34284527/
我刚刚更改了我的 [RegularExpression] 验证,我三分之一的单元测试失败了! 事实证明 AutoFixture 正在根据该正则表达式生成值,这很酷,但它不理解所有正则表达式,所以我想为
我使用 Autofixture 作为 SUT 工厂,但在卡住空实例时遇到困难。 我想做这样的事情: _fixture.Freeze(c => null); 但很快就意识到这是错误的。我已经用这个解决了
我想以不确定的方式自动生成方法的返回值,即每次调用/测试运行时,我都希望方法返回随机值。目前它总是返回方法调用的默认值: public interface IReturn {
给定这些类: public class DrumAndBassBand { public Drums Drum { get; set; } public Bass Bass { get
我正在将我的测试移植到 AutoFixture 2.0 ,而且我遇到了一些我既无法解释也无法解决的奇怪行为。这个简单的测试对我来说失败了: var autoFixtures = new Fixture
我正在研究一个相当嵌套的模型,它有一些循环引用。它还使用 Entity Framework ,因此所有列表都是 ICollection .为了适应这一点,我正在像这样配置 AutoFixture: _
我正在尝试使用 NSubstitute (1.8.2)、AutoFixture (3.33) 和 AutoFixture.AutoNSubstitute (3.33),如下所示: 我有一个 poco,
当我添加一个新的 TracingBehavior到自动夹具 Fixture实例使用 fixture.Behaviors.Add(new TracingBehavior()); 我在我的 R# 单元测试
我目前正在使用 EF Core Code First Approach,并且我有以下域类: public class Employee { // several properties such a
我刚刚开始使用 AutoFixture,我正在了解基础知识(从我所看到的还有更多),但我遇到了一个问题,我不能 100% 确定对于此类事情的最佳实践是什么。 我正在测试一个 Controller ,该
我在我的单元和集成测试中使用 AutoFixture 并遇到了问题。我正在生成数据传输对象,其中一些类在属性上具有 DataAnnotation 属性(其中一些是自定义的)。 AutoFixture
如何设置确定性测试以验证列表中的项目是否已排序? 首先,我执行以下操作: public void SyncListContainsSortedItems( [Frozen] SyncItem[
默认情况下,AutoFixture在“本地未指定时间”中创建DateTime结构。 我一直在尝试找到一种方法来配置它以创建具有UTC类型的DateTime结构,但是到目前为止没有成功。 有没有办法做到
是否可以在卡住后解冻对象类型? 如果我有一个使用 DateTime 的对象 Appointment,有没有办法做这样的事情? var time = fixture.Freeze(); IEnumera
有什么办法可以给 AutoFixture 一个对象的实例,让它通过所有的 setter 并设置随机数据? wiki 示例仅显示如何从 AutoFixture 获取实例,例如 var autoGener
在我使用 AutoFixture 之前的日子里,我可能做了以下安排来设置名为 CustomerService 的服务的单元测试: public void TestName() { //Arrang
我正在尝试编写这个简单的测试: var fixture = new Fixture().Customize(new AutoMoqCustomization()); var postProcessin
我正在尝试使用 SUT Factory “模式”来创建我的 SUT。 给定 SUT 结构: namespace MySut { public class Dep1 { }
我正在使用的域模型有很多循环引用。事实上,可以从图中的任何点到达大多数对象。许多这些循环引用也在集合中。所以一个 Booking将收藏 Students其中有 Courses 的集合其中有 Booki
我遇到了这个错误。 Ploeh.AutoFixture.Kernel.IllegalRequestException : A request for an IntPtr was detected. T
我是一名优秀的程序员,十分优秀!