真正的Mocking不需要在数据库中执行,只需要一个定义好的返回值
示例
添加字段
//private fields
private readonly Mock<IPersonsRepository> _personsRepositoryMock;
private readonly IPersonsRepository _personsRepository;
private readonly IPersonsService _personService;
更新构造函数
_personsRepositoryMock = new Mock<IPersonsRepository>();
_personsRepository = _personsRepositoryMock.Object;
_personService = new PersonsService(_personsRepository);
更新单元测试方法
//When we supply proper person details, it should insert the person into the persons list
//and it should return an object of PersonResponse, which includes with the newly generated person id
[Fact]
public async Task AddPerson_FullPersonDetails_ToBeSuccessful()
{
//Arrange
//PersonAddRequest? personAddRequest = _fixture.Create<PersonAddRequest>();
PersonAddRequest personAddRequest = _fixture.Build<PersonAddRequest>()
.With(p => p.Email, "person@example.com").Create();
Person person = personAddRequest.ToPerson();
PersonResponse person_response_expected = person.ToPersonResponse();
//If we supply any argument value to the AddPersonAsync method,
//it should return the same return value
_personsRepositoryMock.Setup(p => p.AddPersonAsync(It.IsAny<Person>()))
.ReturnsAsync(person);
//Act
PersonResponse personResponse = await _personService.AddPerson(personAddRequest);
person_response_expected.PersonId = personResponse.PersonId;
//Assert
personResponse.PersonId.Should().NotBe(Guid.Empty);
personResponse.Should().Be(person_response_expected);
}
Gitee获取源码: