在使用TDD时我使用Assert.Fail很多.我通常一次只进行一次测试但是当我得到想要实现的东西的想法时,我会快速写一个空的测试,其中测试方法的名称表明我想要实现的todo-list.为了确保我不忘记我在主体中放置了一个Assert.Fail().
在尝试xUnit.Net时,我发现他们没有实现Assert.Fail.当然你总是可以Assert.IsTrue(false),但这并没有表达我的意图.我得到的印象是Assert.Fail没有故意实施.这被认为是不好的做法吗?如果是这样的话?
@Martin Meredith这不完全是我做的事.我先写一个测试,然后实现代码使它工作.通常我会同时考虑几个测试.或者我想在我正在做其他事情的时候写一个测试.那是我写一个空洞的失败测试来记住的时候.当我开始编写测试时,我整齐地尝试测试.
@Jimmeh这看起来是个好主意.忽略的测试不会失败,但它们仍会显示在单独的列表中.必须尝试一下.
@Matt Howells好主意.在这种情况下,NotImplementedException比assert.Fail()更好地传达意图
@Mitch Wheat这就是我想要的.它似乎被排除在外以防止它以另一种滥用它的方式被滥用.
我试图在这个方法上编写Xunit测试:
public async Task<IEnumerable<T>> RunSQLQueryAsync(string queryString)
{
try
{
//do something
}
catch (DocumentClientException e)
{
throw new InvalidOperationException(e);
}
}
Run Code Online (Sandbox Code Playgroud)
这是单元测试:
[Fact]
public async virtual Task Test_Exception()
{
var queryString = "SELECT * FROM c";
var exception = Record.ExceptionAsync(async () => await classname.RunSQLQueryAsync(queryString));
Assert.NotNull(exception);
Assert.IsType<DocumentClientException>(exception);
}
Run Code Online (Sandbox Code Playgroud)
但该方法失败了,它说:
消息:Assert.IsType()预期失败:System.DocumentClientException实际:
System.Threading.Tasks.Task`1 [[System.Exception,System.Private.CoreLib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = xxx] ]
当我调试测试时,它不会进入catch块.所以我的问题是如何使单元测试期望方法RunSQLQueryAsync有DocumentClientException?
请注意,这是针对 System.Text.Json 而不是 Json.Net,因此如何对自定义 JsonConverter 进行单元测试不是重复的。
我喜欢对我的自定义 JsonConverter 进行单元测试:
using System.Text.Json;
public class DateTimeShortConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
// support yyyy-MM-dd but also with times
return DateTime.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("yyyy-MM-dd"));
}
Run Code Online (Sandbox Code Playgroud)
我需要一个Utf8JsonReader,并且我需要用一个来喂养那个string。
我试过这个:
byte[] bytes = Encoding.UTF8.GetBytes("2019-01-02");
var reader = new Utf8JsonReader(bytes.AsSpan());
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但在执行以下操作时会导致转换器崩溃reader.GetString():
System.InvalidOperationException:无法以字符串形式获取令牌类型“None”的值。在 System.Text.Json.Utf8JsonReader.GetString()
应该reader.GetString()是正确的,请参阅微软的示例,所以我认为我喂Utf8JsonReader错了。
它 …