在ABP框架中使用单元测试Xunit测试添加方法

如果您对自动化测试不感兴趣,则可以跳过此部分。

我们可以创建一个单元测试方法来测试CreatePerson方法,如下所示:

        [Fact]
        public async Task Should_Create_Person_With_Valid_Arguments()
        {

            await _personAppService.CreatePerson(
                new CreatePersonInput
                {
                    Name = "黄世仁",
                    Address = "深圳",
                    EmailAddress = "yellow@qq.com"
                });

            //断言的结果
            UsingDbContext(
                context =>
                {
                    var john = context.Persons.FirstOrDefault(p => p.EmailAddress == "yellow@qq.com");
                    john.ShouldNotBe(null);
                    john.Name.ShouldBe("黄世仁");
                });
        }

由于调用方法是异步的,因此测试方法也使用异步模式编写。

我们调用了CreatePerson方法,然后检查指定人的信息是否在数据库中。

UsingDbContext方法是AppTestBase类的辅助方法(我们从中继承了此单元测试类),它用于获取对DbContext的引用并将其直接用于执行数据库操作。

由于提供了所有必填字段,因此该方法成功工作。

让我们尝试为无效参数创建一个测试:

        [Fact]
        public async Task Should_Not_Create_Person_With_Invalid_Arguments()
        {
            //执行并且断言
            await Assert.ThrowsAsync<AbpValidationException>(
                async () =>
                {
                    await _personAppService.CreatePerson(
                        new CreatePersonInput
                        {
                            Name = "周扒皮"
                        });
                });
        }

尽管需要,我们没有设置CreatePersonInput的Surname属性。因此,它会自动引发AbpValidationException。

另外,由于验证系统也会检查null,因此我们无法将null发送给CreatePerson方法。

此测试使用无效的参数调用CreatePerson,并断言它抛出AbpValidationException。 有关更多信息,请参见验证文档

下篇