我正在使用干净的架构,并为我的应用层创建测试.我的问题是,测试用例失败是因为返回了一个空的Guid
,即"00000000-0000-0000-0000-000000000000",而不是用"CF0A8C1C-F2D0-41A1-A12C-53D9BE513A1C"填充
这是Fixture类:
public class MovieFixture
{
private readonly Mock<IMovieRepository> _movieRepository = new Mock<IMovieRepository>();
private ServiceCollection ServiceCollection { get; } = new ServiceCollection();
public CreateMovieCommandHandler CreateMovieCommandHandler
{
get
{
ServiceProvider serviceProvider = ServiceCollection.BuildServiceProvider();
CreateMovieCommandHandler service = serviceProvider.GetRequiredService<CreateMovieCommandHandler>();
return service;
}
}
public MovieFixture()
{
var sampleGuid = new Guid("{CF0A8C1C-F2D0-41A1-A12C-53D9BE513A1C}");
#region Movie command handler mocks
// Create movie.
_movieRepository
.Setup(x => x.CreateAsync(_successMovie.ToMovieDomainModel()))
.ReturnsAsync(sampleGuid);
_movieRepository
.Setup(x => x.CreateAsync(_failedMovie))
.ReturnsAsync(Guid.Empty);
#endregion
#region Add transient services
AddServices();
#endregion
}
private void AddServices()
{
// Add repository mock
_ = ServiceCollection.AddTransient(_ => _movieRepository.Object);
// Add handlers
_ = ServiceCollection.AddTransient<CreateMovieCommandHandler>();
// Add validator
_ = ServiceCollection.AddTransient<MovieValidator<CreateMovieCommand>>();
}
private CreateMovieCommand _successMovie = new CreateMovieCommand
{
Name = "success",
Description = "test",
IsActive = true,
IsExpired = false,
Image = "some-image.png",
StartDate = DateTime.Now
};
private Movie _failedMovie = new Movie
{
Name = "failed",
Description = "test",
IsActive = true,
IsExpired = false,
Image = "some-image.png",
StartDate = DateTime.Now
};
这就是失败的实际测试用例
[Fact]
public async Task Handle_WhenRepositoryReturnsSuccess_ShouldReturnUnitValue()
{
// Arrange
Exception? exception = default;
var handler = _movieFixture.CreateMovieCommandHandler;
Unit result = default;
// Act
try
{
result = await handler.Handle(_successMovie, CancellationToken.None);
}
catch (Exception ex)
{
exception = ex;
}
//Assert
exception.Should().BeNull();
result.Should().Be(Unit.Value);
}
这里也是命令处理程序.
public async Task<Unit> Handle(CreateMovieCommand request, CancellationToken cancellationToken)
{
var validationResult = await _validator.ValidateAsync(request).ConfigureAwait(false);
if (validationResult.IsValid is false)
throw new ValidationException(validationResult.Errors.FirstOrDefault()?.ToString());
var result = await _movieRepository.CreateAsync(request.ToMovieDomainModel()).ConfigureAwait(false);
if (result == Guid.Empty)
throw new MovieCannotBeAddedException(ErrorMessages.MovieCannotBeAdded);
return Unit.Value;
}
希望有人能认出这个错误并帮助我.
祝你有愉快的一天.
我try 了.Returns(Task.FromResult(sampleGuid));
种方法而不是.ReturnsAsync()
种方法,但没有解决这个问题.我还try 为两个模拟生成唯一的随机Guid.NewGuid()
,而不是变量sampleGuid
.但又失败了.