#c# #asp.net #integration-testing #razor-pages #xunit
Вопрос:
Я пытаюсь начать с тестов для FoodValidator. Мне нужна помощь в понимании того, что это за фабрика и что это за фабрика.Услуги.GetService(); делает. И несколько примеров, чтобы показать, как следует проводить тестирование.
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.Extensions.DependencyInjection;
using Xunit;
namespace Food.Project.Tests
{
public class WebApplicationTests : IClassFixture<WebApplicationFactory<Startup>>
{
private readonly WebApplicationFactory<Startup> factory;
public WebApplicationTests(WebApplicationFactory<Startup> factory)
{
this.factory = factory;
}
[Fact]
public void IFoodItemValidatorTests()
{
// itemValidator will be null if it is not registered in the DI container
var itemValidator = factory.Services.GetService<IFoodItemValidator>();
Assert.NotNull(itemValidator);
}
}
}
FoodValidator.cs
public class FoodItemValidator : IFoodItemValidator
{
private List<string> errors { get; set; } = new List<string>();
public string[] IsValid(FoodItem foodItem)
{
if (string.IsNullOrWhiteSpace(foodItem.Name))
{
errors.Add("Name should contain a value and not a space.");
}
if (string.IsNullOrWhiteSpace(foodItem.Description))
{
errors.Add(" Description should contain a value and not a space.");
}
if (foodItem.Price <= 0)
{
errors.Add("Price should be greater than 0.n ");
}
return errors.ToArray();
}
}
}
И IFoodItemValidator:
namespace Food.Project
{
public interface IFoodItemValidator
{
string[] IsValid(FoodItem foodItem);
}
}
Валидатор должен проверить, что имя и описание элемента не являются пустыми и не содержат пробелов. Число должно быть больше 0.
public class FoodItem
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public double Price { get; set; }
public int CookTime { get; set; }
public string Path { get; set; }
}
Комментарии:
1. Вы читали официальную документацию по интеграционному тестированию от Microsoft?. Существует хорошее объяснение того, что делает WebApplicationFactory.
2. @Marco да, но мне это трудно из-за моего знания языка