【发布时间】:2021-07-03 03:46:36
【问题描述】:
我想为 ValidatorCreateAsync 方法编写一个 xUnit 测试,方法如下:
public async Task<ValidationResult> ValidateCreateAsync(IJob job)
{
var validationResult = _validator.NullValidator(job.Payload, job.Module, job.EntityName);
if (validationResult.ValidationResultEnum == ValidationResultEnum.Invalid)
return validationResult;
await _context.Jobs.InsertOneAsync(job as Job);
return validationResult;
}
这是我的 NullValidator 方法:
public ValidationResult NullValidator<T>(params T[] notNullEntities)
{
foreach (var entity in notNullEntities)
{
if (entity == null)
{
return new ValidationResult()
{
ValidationResultEnum = ValidationResultEnum.Invalid,
ValidationResultMessageEnum = ValidationResultMessageEnum.NullProperty
};
}
}
return new ValidationResult()
{
ValidationResultEnum = ValidationResultEnum.Valid,
ValidationResultMessageEnum = ValidationResultMessageEnum.NotNullFound
};
}
在 xUnit 测试中,如何编写 NullValidator 方法的设置以在以下测试中正常工作?
public class JobStoreTest
{
private readonly Mock<IMongoDbContext> _moqIMongoDbContext;
private readonly Mock<IValidator> _moqIValidator;
private readonly JobStore _jobStore;
public JobStoreTest()
{
_moqIMongoDbContext = new Mock<IMongoDbContext>();
_moqIValidator = new Mock<IValidator>();
_jobStore = new JobStore(_moqIMongoDbContext.Object,_moqIValidator.Object);
_moqIMongoDbContext
.Setup(_ => _.Jobs.InsertOneAsync(
It.IsAny<Job>(),
It.IsAny<InsertOneOptions>(),
It.IsAny<CancellationToken>())
)
.Returns((Job y, InsertOneOptions options, CancellationToken token)
=> Task.FromResult(y));
//****************This code does not work here*****************
_moqIValidator.Setup(_ => _.NullValidator(
It.IsAny<Type[]>())
).Returns((Type[] y)
=> Task.FromResult(ValidationResult validation));
}
[Theory]
[ClassData(typeof(JobClassesForTesting))]
public async Task CreateAsync(IJob job)
{
var validationResult = await _jobStore.ValidateCreateAsync(job);
ValidationResult expectedValidationResult = new ValidationResult()
{
ValidationResultEnum = ValidationResultEnum.Valid,
ValidationResultMessageEnum = ValidationResultMessageEnum.NotNullFound
};
Assert.Equal(expectedValidationResult, validationResult);
}
}
我希望第一次测试出错,其他测试应该通过。 这是我的测试场景(JobClassesForTesting):
public IEnumerator<object[]> GetEnumerator()
{
yield return new object[]
{
new Job()
{
Payload = null,
EntityName = "EntityNameTest1",
Module = "ModuleTest1",
}
};
yield return new object[]
{
new Job()
{
Payload = "PayloadTest2",
EntityName = "EntityNameTest2",
Module = "ModuleTest2",
}
};
yield return new object[]
{
new Job()
{
Payload = "PayloadTest3",
EntityName = "EntityNameTest3",
Module = "ModuleTest3",
}
};
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
【问题讨论】:
标签: c# unit-testing asp.net-core xunit xunit.net