gpt4 book ai didi

C#、xunit、fscheck,使用自定义生成器或约束随机字符串编写基于简单属性的测试

转载 作者:行者123 更新时间:2023-11-30 16:42:24 25 4
gpt4 key购买 nike

我正在尝试解决钻石型,以便学习如何使用 fscheck 库编写基于属性的测试。我想用 C# 编写测试,我使用的是 Visual Studio 2017。

我想编写一个基于属性的测试,它不会生成任何随机字符作为输入,而只会生成字母。我不确定如何编写生成器 fscheck 需要执行此操作以及将代码放在哪个文件中?

我到处搜索并阅读了文档,但遇到了麻烦(部分原因是我不能很好地将 F# 翻译成 C#)。

[Property] 如何用于将输入数据限制为仅字母?

如果有更好的方法请告诉我。

[编辑:]

我编辑了我的代码示例,其中现在包含 Kurt Schelfthout 的一个有效解决方案。



测试

using DiamondKata;
using FsCheck;
using FsCheck.Xunit;
using Xunit;

namespace DiamondKataTests
{
public static class Arbitraries
{
private static readonly string upperAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static readonly string lowerAlphabet = ""; //upperAlphabet.ToLower();
private static readonly char[] wholeAlphabet = (lowerAlphabet + upperAlphabet).ToCharArray();
public static Arbitrary<char> LetterGenerator()
{
return Gen.Elements(wholeAlphabet).ToArbitrary();
}
}

public class DiamondKataTests
{
// THIS WORKS and is apparently the preferred way of doing things
// also see here: https://stackoverflow.com/questions/32811322/fscheck-in-c-generate-a-list-of-two-dimension-arrays-with-the-same-shape
[Property()]
public Property shouldReturnStringAssumesValidCharWasProvided()
{
return Prop.ForAll(Arbitraries.LetterGenerator(), letter =>

// test here
Assert.NotNull(Diamond.Create(letter))
);
}

// Second solution ...
// Error here: Arbitraries is a type not valid in the given context
[Property(Arbitrary = new[] { typeof<Arbitraries> })]
public void testThatAssumesValidCharWasProvided(char lettersOnlyHERE)
{
// ?
}
}
}

要测试的类

namespace DiamondKata
{
public class Diamond
{
public static string Create(char turningPointCharacter)
{
return "";
}
}
}

最佳答案

您不能在属性中放置约束,您可以传递给属性的类型仅限于这样做。

您有几个选择。您可以定义自定义 Arbitrary char 的实例,即 Arbitrary<char> 的实现并配置该属性以使用它。

public static class Arbitraries
{
public static Arbitrary<char> LetterGenerator()
{
return Gen.Elements(wholeAlphabet).ToArbitrary();
}
}

public class DiamondKataTestClass1
{
[Property(Arbitrary=new[] { typeof<Arbitraries> })]
public void testThatAssumesValidCharWasProvided(char lettersOnlyHERE)
{
// ?
}
}

您还可以使用更灵活的 API 来自定义内联生成器:

public class DiamondKataTestClass1
{
[Property()]
public Property testThatAssumesValidCharWasProvided()
{
Prop.ForAll(Arbitraries.LetterGenerator()) (letter =>
// test here
)
}
}

关于C#、xunit、fscheck,使用自定义生成器或约束随机字符串编写基于简单属性的测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46827520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com