net core WebApi——使用xUnits来实现单元测试
目录
Fact
新建之后,我们看到有个默认的 [Fact]。
这个就是测试的标准格式了,如果我们不需要测试数据的话,就是在这个标签下的方法做断言,简单举个例子吧。
[Fact] public void TestEqual() { int a = 10, b = 20; Assert.Equal(30, Add(a, b)); } private int Add(int a, int b) { return a + b; }
敲下Assert之后,发现断言好多方法,这里也就不一一说明了,感觉方法名起的都挺明白的,这里就不过多描述了,代码中也有些测试示例,地址在文末给出。
Theory
我们在上面的代码可以看到,所有的数据都是自己定好的,如果我想自己做参数传入测试怎么搞呢,这时候就要用到 [Theory] 这个标签以及 [InlineData]了,标签是为了更好的区分方法的类型(个人理解),来看下这种参数传递的测试怎么搞吧。
[Theory] [InlineData(new object[] { 1, 2, 3, 4 },1)] [InlineData(new object[] { "t", "e", "s", "t" }, "t")] public void TestContains(object[] objs,object obj) { Assert.Contains(obj, objs); }
当然我们也可以使用自定义数组来做测试数据源,这里我起初以为可以传任意类型参数,但是MemberData只支持object[]。
[Theory] [MemberData(nameof(tempDatas))] public void TestData(int a, int b) { int result = a + b; Assert.True(result == Add(a, b)); } public static IEnumerable<object[]> tempDatas { get { yield return new object[] { 1, 2 }; yield return new object[] { 5, 7 }; yield return new object[] { 12, 12 }; } }
控制器
在之前鼓捣单元测试的时候,我一直想一个问题,如果只是这种操作的话,那测试有何意义,但是后来发现,原来单元测试比我以为能做的多得多,所以,学习是个不停的行程,走的多了,风景也就多了。
这里可以引入一个流程,在我们测试自己的工程的时候,我们需要三步来做完单个的测试。
- Arrange(准备工作)
- Act(实现方法)
- Assert(断言结果)
在测试之前,我们需要在当前工程引入一个Moq,至于为什么用这个呢,就跟vue一样我们需要模拟(虽说mock跟Moq还不是那么类似),总不可能我们单元测试引入了orm来实际操作数据库吧(当然测试库这个也是可行的),所以我们需要模拟接口的实现类及方法。
引入完,我们将April.WebApi引入到当前工程,之后我们创建一个Values的接口测试类ValuesControllerTest,然后测试方法如下:
[Fact] public void TestGet() { // Arrange var mockRepo = new Mock<IStudentService>(); var controller = new ValuesController(mockRepo.Object);