初始化
Some checks failed
CI/CD Pipeline / 测试 (18.x) (push) Has been cancelled
CI/CD Pipeline / 测试 (20.x) (push) Has been cancelled
CI/CD Pipeline / 安全检查 (push) Has been cancelled
CI/CD Pipeline / 部署 (push) Has been cancelled
CI/CD Pipeline / 通知 (push) Has been cancelled

This commit is contained in:
2025-11-03 19:47:36 +08:00
parent 7a04b85667
commit f25b0307db
454 changed files with 37064 additions and 4544 deletions

View File

@@ -0,0 +1,293 @@
using Microsoft.EntityFrameworkCore;
using HardwarePerformance.Application.Interfaces;
using HardwarePerformance.Core.Entities;
using HardwarePerformance.Infrastructure.Data;
using HardwarePerformance.Infrastructure.Repositories;
namespace HardwarePerformance.Infrastructure.Tests.Repositories
{
/// <summary>
/// CategoryRepository单元测试
/// </summary>
public class CategoryRepositoryTests : TestBase
{
private readonly ICategoryRepository _categoryRepository;
public CategoryRepositoryTests()
{
_categoryRepository = new CategoryRepository(_context);
}
[Fact]
public async Task GetByIdAsync_WithValidId_ReturnsCategory()
{
// Arrange
var categoryId = 1;
// Act
var result = await _categoryRepository.GetByIdAsync(categoryId);
// Assert
Assert.NotNull(result);
Assert.Equal(categoryId, result.Id);
Assert.Equal("手机CPU", result.Name);
}
[Fact]
public async Task GetByIdAsync_WithInvalidId_ReturnsNull()
{
// Arrange
var categoryId = 999;
// Act
var result = await _categoryRepository.GetByIdAsync(categoryId);
// Assert
Assert.Null(result);
}
[Fact]
public async Task GetAllAsync_ReturnsAllCategories()
{
// Act
var result = await _categoryRepository.GetAllAsync();
// Assert
Assert.NotNull(result);
Assert.Equal(4, result.Count());
}
[Fact]
public async Task FindAsync_WithValidPredicate_ReturnsFilteredCategories()
{
// Arrange
var predicate = (Category c) => c.Name.Contains("CPU");
// Act
var result = await _categoryRepository.FindAsync(predicate);
// Assert
Assert.NotNull(result);
Assert.Equal(2, result.Count());
Assert.All(result, c => Assert.Contains("CPU", c.Name));
}
[Fact]
public async Task ExistsAsync_WithExistingCategory_ReturnsTrue()
{
// Arrange
var predicate = (Category c) => c.Name == "手机CPU";
// Act
var result = await _categoryRepository.ExistsAsync(predicate);
// Assert
Assert.True(result);
}
[Fact]
public async Task ExistsAsync_WithNonExistingCategory_ReturnsFalse()
{
// Arrange
var predicate = (Category c) => c.Name == "不存在的类别";
// Act
var result = await _categoryRepository.ExistsAsync(predicate);
// Assert
Assert.False(result);
}
[Fact]
public async Task AddAsync_WithValidCategory_ReturnsAddedCategory()
{
// Arrange
var newCategory = new Category
{
Name = "测试类别",
Description = "测试类别描述",
Icon = "test"
};
// Act
var result = await _categoryRepository.AddAsync(newCategory);
// Assert
Assert.NotNull(result);
Assert.True(result.Id > 0);
Assert.Equal("测试类别", result.Name);
// 验证是否已添加到数据库
var savedCategory = await _categoryRepository.GetByIdAsync(result.Id);
Assert.NotNull(savedCategory);
Assert.Equal("测试类别", savedCategory.Name);
}
[Fact]
public async Task UpdateAsync_WithValidCategory_ReturnsUpdatedCategory()
{
// Arrange
var category = await _categoryRepository.GetByIdAsync(1);
category.Description = "更新后的描述";
// Act
var result = await _categoryRepository.UpdateAsync(category);
// Assert
Assert.NotNull(result);
Assert.Equal("更新后的描述", result.Description);
// 验证是否已更新到数据库
var savedCategory = await _categoryRepository.GetByIdAsync(1);
Assert.Equal("更新后的描述", savedCategory.Description);
}
[Fact]
public async Task DeleteAsync_WithValidCategory_ReturnsTrue()
{
// Arrange
var category = await _categoryRepository.GetByIdAsync(1);
// Act
var result = await _categoryRepository.DeleteAsync(category);
// Assert
Assert.True(result);
// 验证是否已从数据库删除
var deletedCategory = await _categoryRepository.GetByIdAsync(1);
Assert.Null(deletedCategory);
}
[Fact]
public async Task DeleteByIdAsync_WithValidId_ReturnsTrue()
{
// Arrange
var categoryId = 1;
// Act
var result = await _categoryRepository.DeleteByIdAsync(categoryId);
// Assert
Assert.True(result);
// 验证是否已从数据库删除
var deletedCategory = await _categoryRepository.GetByIdAsync(categoryId);
Assert.Null(deletedCategory);
}
[Fact]
public async Task DeleteByIdAsync_WithInvalidId_ReturnsFalse()
{
// Arrange
var categoryId = 999;
// Act
var result = await _categoryRepository.DeleteByIdAsync(categoryId);
// Assert
Assert.False(result);
}
[Fact]
public async Task CountAsync_ReturnsCorrectCount()
{
// Act
var result = await _categoryRepository.CountAsync();
// Assert
Assert.Equal(4, result);
}
[Fact]
public async Task CountAsync_WithPredicate_ReturnsCorrectCount()
{
// Arrange
var predicate = (Category c) => c.Name.Contains("CPU");
// Act
var result = await _categoryRepository.CountAsync(predicate);
// Assert
Assert.Equal(2, result);
}
[Fact]
public async Task GetByNameAsync_WithExistingName_ReturnsCategory()
{
// Arrange
var categoryName = "手机CPU";
// Act
var result = await _categoryRepository.GetByNameAsync(categoryName);
// Assert
Assert.NotNull(result);
Assert.Equal(categoryName, result.Name);
}
[Fact]
public async Task GetByNameAsync_WithNonExistingName_ReturnsNull()
{
// Arrange
var categoryName = "不存在的类别";
// Act
var result = await _categoryRepository.GetByNameAsync(categoryName);
// Assert
Assert.Null(result);
}
[Fact]
public async Task GetCategoriesWithProductCountAsync_ReturnsCategories()
{
// Act
var result = await _categoryRepository.GetCategoriesWithProductCountAsync();
// Assert
Assert.NotNull(result);
Assert.Equal(4, result.Count());
}
[Fact]
public async Task IsNameExistsAsync_WithExistingName_ReturnsTrue()
{
// Arrange
var categoryName = "手机CPU";
// Act
var result = await _categoryRepository.IsNameExistsAsync(categoryName);
// Assert
Assert.True(result);
}
[Fact]
public async Task IsNameExistsAsync_WithNonExistingName_ReturnsFalse()
{
// Arrange
var categoryName = "不存在的类别";
// Act
var result = await _categoryRepository.IsNameExistsAsync(categoryName);
// Assert
Assert.False(result);
}
[Fact]
public async Task IsNameExistsAsync_WithExistingNameAndExcludeId_ReturnsFalse()
{
// Arrange
var categoryName = "手机CPU";
var excludeId = 1;
// Act
var result = await _categoryRepository.IsNameExistsAsync(categoryName, excludeId);
// Assert
Assert.False(result);
}
}
}

View File

@@ -0,0 +1,561 @@
using Microsoft.EntityFrameworkCore;
using HardwarePerformance.Application.Interfaces;
using HardwarePerformance.Core.Entities;
using HardwarePerformance.Infrastructure.Data;
using HardwarePerformance.Infrastructure.Repositories;
namespace HardwarePerformance.Infrastructure.Tests.Repositories
{
/// <summary>
/// ProductRepository单元测试
/// </summary>
public class ProductRepositoryTests : TestBase
{
private readonly IProductRepository _productRepository;
public ProductRepositoryTests()
{
_productRepository = new ProductRepository(_context);
}
[Fact]
public async Task GetByIdAsync_WithValidId_ReturnsProduct()
{
// Arrange
var productId = 1;
// Act
var result = await _productRepository.GetByIdAsync(productId);
// Assert
Assert.NotNull(result);
Assert.Equal(productId, result.Id);
Assert.Equal("Snapdragon 8 Gen 3", result.Name);
}
[Fact]
public async Task GetByIdAsync_WithInvalidId_ReturnsNull()
{
// Arrange
var productId = 999;
// Act
var result = await _productRepository.GetByIdAsync(productId);
// Assert
Assert.Null(result);
}
[Fact]
public async Task GetAllAsync_ReturnsAllProducts()
{
// Act
var result = await _productRepository.GetAllAsync();
// Assert
Assert.NotNull(result);
Assert.Equal(6, result.Count());
}
[Fact]
public async Task FindAsync_WithValidPredicate_ReturnsFilteredProducts()
{
// Arrange
Expression<Func<Product, bool>> predicate = p => p.CategoryId == 1;
// Act
var result = await _productRepository.FindAsync(predicate);
// Assert
Assert.NotNull(result);
Assert.Equal(2, result.Count());
Assert.All(result, p => Assert.Equal(1, p.CategoryId));
}
[Fact]
public async Task ExistsAsync_WithExistingProduct_ReturnsTrue()
{
// Arrange
Expression<Func<Product, bool>> predicate = p => p.Name == "Snapdragon 8 Gen 3";
// Act
var result = await _productRepository.ExistsAsync(predicate);
// Assert
Assert.True(result);
}
[Fact]
public async Task ExistsAsync_WithNonExistingProduct_ReturnsFalse()
{
// Arrange
Expression<Func<Product, bool>> predicate = p => p.Name == "不存在的产品";
// Act
var result = await _productRepository.ExistsAsync(predicate);
// Assert
Assert.False(result);
}
[Fact]
public async Task AddAsync_WithValidProduct_ReturnsAddedProduct()
{
// Arrange
var newProduct = new Product
{
Name = "测试产品",
Model = "Test-001",
Manufacturer = "测试厂商",
CategoryId = 1,
ReleaseDate = DateTime.Now,
ImageUrl = "test.jpg",
Description = "测试产品描述",
CurrentRank = 0
};
// Act
var result = await _productRepository.AddAsync(newProduct);
// Assert
Assert.NotNull(result);
Assert.True(result.Id > 0);
Assert.Equal("测试产品", result.Name);
// 验证是否已添加到数据库
var savedProduct = await _productRepository.GetByIdAsync(result.Id);
Assert.NotNull(savedProduct);
Assert.Equal("测试产品", savedProduct.Name);
}
[Fact]
public async Task UpdateAsync_WithValidProduct_ReturnsUpdatedProduct()
{
// Arrange
var product = await _productRepository.GetByIdAsync(1);
product.Description = "更新后的描述";
// Act
var result = await _productRepository.UpdateAsync(product);
// Assert
Assert.NotNull(result);
Assert.Equal("更新后的描述", result.Description);
// 验证是否已更新到数据库
var savedProduct = await _productRepository.GetByIdAsync(1);
Assert.Equal("更新后的描述", savedProduct.Description);
}
[Fact]
public async Task DeleteAsync_WithValidProduct_ReturnsTrue()
{
// Arrange
var product = await _productRepository.GetByIdAsync(1);
// Act
var result = await _productRepository.DeleteAsync(product);
// Assert
Assert.True(result);
// 验证是否已从数据库删除
var deletedProduct = await _productRepository.GetByIdAsync(1);
Assert.Null(deletedProduct);
}
[Fact]
public async Task DeleteByIdAsync_WithValidId_ReturnsTrue()
{
// Arrange
var productId = 1;
// Act
var result = await _productRepository.DeleteByIdAsync(productId);
// Assert
Assert.True(result);
// 验证是否已从数据库删除
var deletedProduct = await _productRepository.GetByIdAsync(productId);
Assert.Null(deletedProduct);
}
[Fact]
public async Task DeleteByIdAsync_WithInvalidId_ReturnsFalse()
{
// Arrange
var productId = 999;
// Act
var result = await _productRepository.DeleteByIdAsync(productId);
// Assert
Assert.False(result);
}
[Fact]
public async Task CountAsync_ReturnsCorrectCount()
{
// Act
var result = await _productRepository.CountAsync();
// Assert
Assert.Equal(6, result);
}
[Fact]
public async Task CountAsync_WithPredicate_ReturnsCorrectCount()
{
// Arrange
Expression<Func<Product, bool>> predicate = p => p.CategoryId == 1;
// Act
var result = await _productRepository.CountAsync(predicate);
// Assert
Assert.Equal(2, result);
}
[Fact]
public async Task GetByCategoryAsync_WithValidCategory_ReturnsPagedProducts()
{
// Arrange
var categoryId = 1;
var page = 1;
var pageSize = 10;
var sortBy = "Name";
var ascending = true;
// Act
var result = await _productRepository.GetByCategoryAsync(categoryId, page, pageSize, sortBy, ascending);
// Assert
Assert.NotNull(result);
Assert.Equal(2, result.Items.Count());
Assert.Equal(2, result.TotalCount);
Assert.Equal(1, result.Page);
Assert.Equal(10, result.PageSize);
Assert.Equal(1, result.TotalPages);
}
[Fact]
public async Task GetByCategoryAsync_WithInvalidCategory_ReturnsEmptyResult()
{
// Arrange
var categoryId = 999;
var page = 1;
var pageSize = 10;
var sortBy = "Name";
var ascending = true;
// Act
var result = await _productRepository.GetByCategoryAsync(categoryId, page, pageSize, sortBy, ascending);
// Assert
Assert.NotNull(result);
Assert.Empty(result.Items);
Assert.Equal(0, result.TotalCount);
Assert.Equal(1, result.Page);
Assert.Equal(10, result.PageSize);
Assert.Equal(0, result.TotalPages);
}
[Fact]
public async Task GetByCategoryAsync_WithPagination_ReturnsCorrectPage()
{
// Arrange
var categoryId = 1;
var page = 1;
var pageSize = 1;
var sortBy = "Name";
var ascending = true;
// Act
var result = await _productRepository.GetByCategoryAsync(categoryId, page, pageSize, sortBy, ascending);
// Assert
Assert.NotNull(result);
Assert.Single(result.Items);
Assert.Equal(2, result.TotalCount);
Assert.Equal(1, result.Page);
Assert.Equal(1, result.PageSize);
Assert.Equal(2, result.TotalPages);
}
[Fact]
public async Task GetByCategoryAsync_WithSortByScore_ReturnsSortedProducts()
{
// Arrange
var categoryId = 1;
var page = 1;
var pageSize = 10;
var sortBy = "PerformanceScore";
var ascending = false;
// Act
var result = await _productRepository.GetByCategoryAsync(categoryId, page, pageSize, sortBy, ascending);
// Assert
Assert.NotNull(result);
Assert.Equal(2, result.Items.Count());
// 验证按性能分数降序排列
var products = result.Items.ToList();
Assert.True(products[0].PerformanceScore >= products[1].PerformanceScore);
}
[Fact]
public async Task SearchAsync_WithValidQuery_ReturnsPagedResults()
{
// Arrange
var query = "Snapdragon";
var page = 1;
var pageSize = 10;
var sortBy = "Name";
var ascending = true;
// Act
var result = await _productRepository.SearchAsync(query, page, pageSize, sortBy, ascending);
// Assert
Assert.NotNull(result);
Assert.Single(result.Items);
Assert.Equal(1, result.TotalCount);
Assert.Equal(1, result.Page);
Assert.Equal(10, result.PageSize);
Assert.Equal(1, result.TotalPages);
}
[Fact]
public async Task SearchAsync_WithInvalidQuery_ReturnsEmptyResult()
{
// Arrange
var query = "不存在的产品";
var page = 1;
var pageSize = 10;
var sortBy = "Name";
var ascending = true;
// Act
var result = await _productRepository.SearchAsync(query, page, pageSize, sortBy, ascending);
// Assert
Assert.NotNull(result);
Assert.Empty(result.Items);
Assert.Equal(0, result.TotalCount);
Assert.Equal(1, result.Page);
Assert.Equal(10, result.PageSize);
Assert.Equal(0, result.TotalPages);
}
[Fact]
public async Task SearchAsync_WithCategoryFilter_ReturnsFilteredResults()
{
// Arrange
var query = "Gen";
var categoryId = 1;
var page = 1;
var pageSize = 10;
var sortBy = "Name";
var ascending = true;
// Act
var result = await _productRepository.SearchAsync(query, page, pageSize, sortBy, ascending, categoryId);
// Assert
Assert.NotNull(result);
Assert.Single(result.Items);
Assert.Equal(1, result.TotalCount);
Assert.Equal(1, result.Items.First().CategoryId);
}
[Fact]
public async Task SearchAsync_WithManufacturerFilter_ReturnsFilteredResults()
{
// Arrange
var query = "Gen";
var manufacturer = "Qualcomm";
var page = 1;
var pageSize = 10;
var sortBy = "Name";
var ascending = true;
// Act
var result = await _productRepository.SearchAsync(query, page, pageSize, sortBy, ascending, null, manufacturer);
// Assert
Assert.NotNull(result);
Assert.Single(result.Items);
Assert.Equal("Qualcomm", result.Items.First().Manufacturer);
}
[Fact]
public async Task FilterAsync_WithScoreRange_ReturnsFilteredResults()
{
// Arrange
var minScore = 2000;
var maxScore = 3000;
var page = 1;
var pageSize = 10;
var sortBy = "Name";
var ascending = true;
// Act
var result = await _productRepository.FilterAsync(minScore, maxScore, page, pageSize, sortBy, ascending);
// Assert
Assert.NotNull(result);
Assert.Equal(2, result.Items.Count());
Assert.Equal(2, result.TotalCount);
Assert.All(result.Items, p => Assert.True(p.PerformanceScore >= minScore && p.PerformanceScore <= maxScore));
}
[Fact]
public async Task FilterAsync_WithYearFilter_ReturnsFilteredResults()
{
// Arrange
var year = 2023;
var page = 1;
var pageSize = 10;
var sortBy = "Name";
var ascending = true;
// Act
var result = await _productRepository.FilterAsync(null, null, page, pageSize, sortBy, ascending, year);
// Assert
Assert.NotNull(result);
Assert.Equal(2, result.Items.Count());
Assert.Equal(2, result.TotalCount);
Assert.All(result.Items, p => Assert.Equal(year, p.ReleaseDate.Year));
}
[Fact]
public async Task FilterAsync_WithManufacturerFilter_ReturnsFilteredResults()
{
// Arrange
var manufacturer = "Qualcomm";
var page = 1;
var pageSize = 10;
var sortBy = "Name";
var ascending = true;
// Act
var result = await _productRepository.FilterAsync(null, null, page, pageSize, sortBy, ascending, null, manufacturer);
// Assert
Assert.NotNull(result);
Assert.Single(result.Items);
Assert.Equal(1, result.TotalCount);
Assert.Equal(manufacturer, result.Items.First().Manufacturer);
}
[Fact]
public async Task FilterAsync_WithCategoryFilter_ReturnsFilteredResults()
{
// Arrange
var categoryId = 1;
var page = 1;
var pageSize = 10;
var sortBy = "Name";
var ascending = true;
// Act
var result = await _productRepository.FilterAsync(null, null, page, pageSize, sortBy, ascending, null, null, categoryId);
// Assert
Assert.NotNull(result);
Assert.Equal(2, result.Items.Count());
Assert.Equal(2, result.TotalCount);
Assert.All(result.Items, p => Assert.Equal(categoryId, p.CategoryId));
}
[Fact]
public async Task GetTopNByCategoryAsync_WithValidParameters_ReturnsTopProducts()
{
// Arrange
var categoryId = 1;
var n = 1;
// Act
var result = await _productRepository.GetTopNByCategoryAsync(categoryId, n);
// Assert
Assert.NotNull(result);
Assert.Single(result);
Assert.Equal(categoryId, result.First().CategoryId);
}
[Fact]
public async Task GetTopNByCategoryAsync_WithInvalidCategory_ReturnsEmptyResult()
{
// Arrange
var categoryId = 999;
var n = 5;
// Act
var result = await _productRepository.GetTopNByCategoryAsync(categoryId, n);
// Assert
Assert.NotNull(result);
Assert.Empty(result);
}
[Fact]
public async Task GetByModelAsync_WithExistingModel_ReturnsProduct()
{
// Arrange
var model = "SM-G998B";
// Act
var result = await _productRepository.GetByModelAsync(model);
// Assert
Assert.NotNull(result);
Assert.Equal(model, result.Model);
}
[Fact]
public async Task GetByModelAsync_WithNonExistingModel_ReturnsNull()
{
// Arrange
var model = "不存在的型号";
// Act
var result = await _productRepository.GetByModelAsync(model);
// Assert
Assert.Null(result);
}
[Fact]
public async Task GetByManufacturerAsync_WithExistingManufacturer_ReturnsProducts()
{
// Arrange
var manufacturer = "Qualcomm";
// Act
var result = await _productRepository.GetByManufacturerAsync(manufacturer);
// Assert
Assert.NotNull(result);
Assert.Single(result);
Assert.Equal(manufacturer, result.First().Manufacturer);
}
[Fact]
public async Task GetByManufacturerAsync_WithNonExistingManufacturer_ReturnsEmptyResult()
{
// Arrange
var manufacturer = "不存在的厂商";
// Act
var result = await _productRepository.GetByManufacturerAsync(manufacturer);
// Assert
Assert.NotNull(result);
Assert.Empty(result);
}
}
}

View File

@@ -0,0 +1,394 @@
using Microsoft.EntityFrameworkCore;
using HardwarePerformance.Core.Entities;
using HardwarePerformance.Infrastructure.Data;
using HardwarePerformance.Infrastructure.Repositories;
namespace HardwarePerformance.Infrastructure.Tests.Repositories
{
/// <summary>
/// Repository基类单元测试
/// </summary>
public class RepositoryTests : TestBase
{
private readonly Repository<Category> _categoryRepository;
private readonly Repository<Product> _productRepository;
public RepositoryTests()
{
_categoryRepository = new Repository<Category>(_context);
_productRepository = new Repository<Product>(_context);
}
[Fact]
public async Task GetByIdAsync_WithValidId_ReturnsEntity()
{
// Arrange
var categoryId = 1;
// Act
var result = await _categoryRepository.GetByIdAsync(categoryId);
// Assert
Assert.NotNull(result);
Assert.Equal(categoryId, result.Id);
}
[Fact]
public async Task GetByIdAsync_WithInvalidId_ReturnsNull()
{
// Arrange
var categoryId = 999;
// Act
var result = await _categoryRepository.GetByIdAsync(categoryId);
// Assert
Assert.Null(result);
}
[Fact]
public async Task GetAllAsync_ReturnsAllEntities()
{
// Act
var result = await _categoryRepository.GetAllAsync();
// Assert
Assert.NotNull(result);
Assert.Equal(4, result.Count());
}
[Fact]
public async Task FindAsync_WithValidPredicate_ReturnsFilteredEntities()
{
// Arrange
var predicate = (Category c) => c.Name.Contains("CPU");
// Act
var result = await _categoryRepository.FindAsync(predicate);
// Assert
Assert.NotNull(result);
Assert.Equal(2, result.Count());
Assert.All(result, c => Assert.Contains("CPU", c.Name));
}
[Fact]
public async Task ExistsAsync_WithExistingEntity_ReturnsTrue()
{
// Arrange
var predicate = (Category c) => c.Name == "手机CPU";
// Act
var result = await _categoryRepository.ExistsAsync(predicate);
// Assert
Assert.True(result);
}
[Fact]
public async Task ExistsAsync_WithNonExistingEntity_ReturnsFalse()
{
// Arrange
var predicate = (Category c) => c.Name == "不存在的类别";
// Act
var result = await _categoryRepository.ExistsAsync(predicate);
// Assert
Assert.False(result);
}
[Fact]
public async Task AddAsync_WithValidEntity_ReturnsAddedEntity()
{
// Arrange
var newCategory = new Category
{
Name = "测试类别",
Description = "测试类别描述",
Icon = "test"
};
// Act
var result = await _categoryRepository.AddAsync(newCategory);
// Assert
Assert.NotNull(result);
Assert.True(result.Id > 0);
Assert.Equal("测试类别", result.Name);
// 验证是否已添加到数据库
var savedCategory = await _categoryRepository.GetByIdAsync(result.Id);
Assert.NotNull(savedCategory);
Assert.Equal("测试类别", savedCategory.Name);
}
[Fact]
public async Task UpdateAsync_WithValidEntity_ReturnsUpdatedEntity()
{
// Arrange
var category = await _categoryRepository.GetByIdAsync(1);
category.Description = "更新后的描述";
// Act
var result = await _categoryRepository.UpdateAsync(category);
// Assert
Assert.NotNull(result);
Assert.Equal("更新后的描述", result.Description);
// 验证是否已更新到数据库
var savedCategory = await _categoryRepository.GetByIdAsync(1);
Assert.Equal("更新后的描述", savedCategory.Description);
}
[Fact]
public async Task DeleteAsync_WithValidEntity_ReturnsTrue()
{
// Arrange
var category = await _categoryRepository.GetByIdAsync(1);
// Act
var result = await _categoryRepository.DeleteAsync(category);
// Assert
Assert.True(result);
// 验证是否已从数据库删除
var deletedCategory = await _categoryRepository.GetByIdAsync(1);
Assert.Null(deletedCategory);
}
[Fact]
public async Task DeleteByIdAsync_WithValidId_ReturnsTrue()
{
// Arrange
var categoryId = 1;
// Act
var result = await _categoryRepository.DeleteByIdAsync(categoryId);
// Assert
Assert.True(result);
// 验证是否已从数据库删除
var deletedCategory = await _categoryRepository.GetByIdAsync(categoryId);
Assert.Null(deletedCategory);
}
[Fact]
public async Task DeleteByIdAsync_WithInvalidId_ReturnsFalse()
{
// Arrange
var categoryId = 999;
// Act
var result = await _categoryRepository.DeleteByIdAsync(categoryId);
// Assert
Assert.False(result);
}
[Fact]
public async Task CountAsync_ReturnsCorrectCount()
{
// Act
var result = await _categoryRepository.CountAsync();
// Assert
Assert.Equal(4, result);
}
[Fact]
public async Task CountAsync_WithPredicate_ReturnsCorrectCount()
{
// Arrange
var predicate = (Category c) => c.Name.Contains("CPU");
// Act
var result = await _categoryRepository.CountAsync(predicate);
// Assert
Assert.Equal(2, result);
}
[Fact]
public async Task AddRangeAsync_WithValidEntities_ReturnsAddedEntities()
{
// Arrange
var newCategories = new List<Category>
{
new Category
{
Name = "测试类别1",
Description = "测试类别描述1",
Icon = "test1"
},
new Category
{
Name = "测试类别2",
Description = "测试类别描述2",
Icon = "test2"
}
};
// Act
var result = await _categoryRepository.AddRangeAsync(newCategories);
// Assert
Assert.NotNull(result);
Assert.Equal(2, result.Count());
Assert.All(result, c => Assert.True(c.Id > 0));
// 验证是否已添加到数据库
var savedCategories = await _categoryRepository.FindAsync(c => c.Name.Contains("测试类别"));
Assert.Equal(2, savedCategories.Count());
}
[Fact]
public async Task UpdateRangeAsync_WithValidEntities_ReturnsUpdatedEntities()
{
// Arrange
var categories = await _categoryRepository.FindAsync(c => c.Name.Contains("CPU"));
foreach (var category in categories)
{
category.Description = "更新后的描述";
}
// Act
var result = await _categoryRepository.UpdateRangeAsync(categories);
// Assert
Assert.NotNull(result);
Assert.Equal(2, result.Count());
Assert.All(result, c => Assert.Equal("更新后的描述", c.Description));
// 验证是否已更新到数据库
var savedCategories = await _categoryRepository.FindAsync(c => c.Name.Contains("CPU"));
Assert.All(savedCategories, c => Assert.Equal("更新后的描述", c.Description));
}
[Fact]
public async Task DeleteRangeAsync_WithValidEntities_ReturnsTrue()
{
// Arrange
var categories = await _categoryRepository.FindAsync(c => c.Name.Contains("CPU"));
// Act
var result = await _categoryRepository.DeleteRangeAsync(categories);
// Assert
Assert.True(result);
// 验证是否已从数据库删除
var deletedCategories = await _categoryRepository.FindAsync(c => c.Name.Contains("CPU"));
Assert.Empty(deletedCategories);
}
[Fact]
public async Task FirstOrDefaultAsync_WithValidPredicate_ReturnsEntity()
{
// Arrange
var predicate = (Category c) => c.Name.Contains("CPU");
// Act
var result = await _categoryRepository.FirstOrDefaultAsync(predicate);
// Assert
Assert.NotNull(result);
Assert.Contains("CPU", result.Name);
}
[Fact]
public async Task FirstOrDefaultAsync_WithInvalidPredicate_ReturnsNull()
{
// Arrange
var predicate = (Category c) => c.Name == "不存在的类别";
// Act
var result = await _categoryRepository.FirstOrDefaultAsync(predicate);
// Assert
Assert.Null(result);
}
[Fact]
public async Task LastOrDefaultAsync_WithValidPredicate_ReturnsEntity()
{
// Arrange
var predicate = (Category c) => c.Name.Contains("CPU");
// Act
var result = await _categoryRepository.LastOrDefaultAsync(predicate);
// Assert
Assert.NotNull(result);
Assert.Contains("CPU", result.Name);
}
[Fact]
public async Task LastOrDefaultAsync_WithInvalidPredicate_ReturnsNull()
{
// Arrange
var predicate = (Category c) => c.Name == "不存在的类别";
// Act
var result = await _categoryRepository.LastOrDefaultAsync(predicate);
// Assert
Assert.Null(result);
}
[Fact]
public async Task AnyAsync_WithValidPredicate_ReturnsTrue()
{
// Arrange
var predicate = (Category c) => c.Name.Contains("CPU");
// Act
var result = await _categoryRepository.AnyAsync(predicate);
// Assert
Assert.True(result);
}
[Fact]
public async Task AnyAsync_WithInvalidPredicate_ReturnsFalse()
{
// Arrange
var predicate = (Category c) => c.Name == "不存在的类别";
// Act
var result = await _categoryRepository.AnyAsync(predicate);
// Assert
Assert.False(result);
}
[Fact]
public async Task AllAsync_WithValidPredicate_ReturnsTrue()
{
// Arrange
var predicate = (Category c) => !string.IsNullOrEmpty(c.Name);
// Act
var result = await _categoryRepository.AllAsync(predicate);
// Assert
Assert.True(result);
}
[Fact]
public async Task AllAsync_WithInvalidPredicate_ReturnsFalse()
{
// Arrange
var predicate = (Category c) => c.Name == "手机CPU";
// Act
var result = await _categoryRepository.AllAsync(predicate);
// Assert
Assert.False(result);
}
}
}