You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
1.7 KiB
Markdown
78 lines
1.7 KiB
Markdown
说明
|
|
============
|
|
## 断言:不发生异常
|
|
|
|
高版本取消了 Assert.NotThrow() 断言,使得断言 "代码断不发生异常" 比较困难。
|
|
解决方法:
|
|
+ 使用 xUnit 自带 Record 变通实现
|
|
```csharp
|
|
//待执行代码段
|
|
Action codeSnippet = () =>
|
|
{
|
|
//业务代码
|
|
|
|
//模拟异常
|
|
//throw new Exception("我是特意抛出的异常!");
|
|
};
|
|
|
|
var exception = Record.Exception(codeSnippet);
|
|
Assert.Null(exception);
|
|
```
|
|
+ 使用 FluentAssertions 库
|
|
```csharp
|
|
//待执行代码段
|
|
Action codeSnippet= () =>
|
|
{
|
|
//业务代码
|
|
|
|
//模拟异常
|
|
//throw new Exception("我是特意抛出的异常!");
|
|
};
|
|
|
|
//断言:不发生异常
|
|
codeSnippet.Should().NotThrow();
|
|
```
|
|
|
|
## 断言:方法的执行情况(执行过一次等)
|
|
目前没法有找到针对方法执行情况的断言(比如 执行过 只执行一次 最少执行一次),但有一些变通方法
|
|
|
|
+ 使用 Moq 库,但是只能针对"模拟对象",并且只针对虚方法或接口方法
|
|
```csharp
|
|
public class Person
|
|
{
|
|
public string Name { get; set; }
|
|
public int Id { get; set; }
|
|
|
|
/// <summary>
|
|
/// 必须是虚方法或接口
|
|
/// </summary>
|
|
public virtual void DoSomething()
|
|
{
|
|
Console.WriteLine("我是方法");
|
|
}
|
|
}
|
|
|
|
using Moq;
|
|
namespace WatchStudy.CancellationTokenStudy
|
|
{
|
|
public class UnitTest1
|
|
{
|
|
//测试方法
|
|
[Fact]
|
|
public void Test1()
|
|
{
|
|
//模拟方法
|
|
var mock = new Mock<Person>();
|
|
mock.Setup(foo => foo.DoSomething());
|
|
|
|
//调用方法一次
|
|
mock.Object.DoSomething();
|
|
|
|
//断言 DoSomething 方法执行一次
|
|
mock.Verify(foo => foo.DoSomething(), Times.Once());
|
|
}
|
|
}
|
|
}
|
|
|
|
```
|