using System.IO;
using System.Text.Json;

namespace Dpz.Core.ServiceTest;

[TestFixture]
public class SteamGameTest : Basic
{
    [Test]
    public async Task UpdateTest()
    {
        var service =
            ServiceProvider.GetService<ISteamGameService>()
            ?? throw new Exception("ISteamGameService is null");
        service.OnLogoDownloadComplete += async (stream, _) =>
        {
            await using var fileStream = new FileStream(
                @$"D:\localDevTemp\Stream\{Guid.NewGuid():N}",
                FileMode.Create,
                FileAccess.Write
            );
            var name = fileStream.Name;
            await stream.CopyToAsync(fileStream);
            await fileStream.FlushAsync();
            return name;
        };

        service.OnAchievementIconDownloadComplete += async (stream, _, _) =>
        {
            await using var fileStream = new FileStream(
                @$"D:\localDevTemp\Stream\{Guid.NewGuid():N}",
                FileMode.Create,
                FileAccess.Write
            );
            var name = fileStream.Name;
            await stream.CopyToAsync(fileStream);
            await fileStream.FlushAsync();
            return name;
        };

        service.OnAchievementIconGrayDownloadComplete += async (stream, _, _) =>
        {
            await using var fileStream = new FileStream(
                @$"D:\localDevTemp\Stream\{Guid.NewGuid():N}",
                FileMode.Create,
                FileAccess.Write
            );
            var name = fileStream.Name;
            await stream.CopyToAsync(fileStream);
            await fileStream.FlushAsync();
            return name;
        };

        await service.UpdateGamesAsync();
    }

    [Test]
    public async Task GetGamesTest()
    {
        var service =
            ServiceProvider.GetService<ISteamGameService>()
            ?? throw new Exception("ISteamGameService is null");
        var list = await service.GetGamesAsync();

        Assert.That(list, Is.Not.Null);
        Assert.That(list, Is.Not.Empty);

        await using var fileStream = new FileStream(
            @"D:\work\temp data\steam_data.json",
            FileMode.Create,
            FileAccess.Write
        );
        await JsonSerializer.SerializeAsync(
            fileStream,
            list,
            options: new JsonSerializerOptions { WriteIndented = true }
        );
        await fileStream.FlushAsync();
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这是一个使用 NUnit 测试框架编写的单元测试类,用于测试 Steam 游戏相关的服务功能。让我详细解释一下代码的各个部分:

类结构

[TestFixture]
public class SteamGameTest : Basic
  • [TestFixture] 标记这是一个测试类
  • 继承自 Basic 类,可能包含一些基础的测试设置和服务提供者配置

第一个测试方法:UpdateTest()

这个测试主要验证 Steam 游戏数据的更新功能:

服务获取

var service = ServiceProvider.GetService<ISteamGameService>() 
    ?? throw new Exception("ISteamGameService is null");

从依赖注入容器中获取 ISteamGameService 实例

事件处理器设置

代码设置了三个事件处理器,用于处理不同类型的图片下载:

  1. Logo 下载完成事件

    service.OnLogoDownloadComplete += async (stream, _) => { ... }
    
  2. 成就图标下载完成事件

    service.OnAchievementIconDownloadComplete += async (stream, _, _) => { ... }
    
  3. 成就图标灰色版本下载完成事件

    service.OnAchievementIconGrayDownloadComplete += async (stream, _, _) => { ... }
    

每个事件处理器都执行相同的操作:

  • 使用 GUID 生成唯一文件名
  • 在指定目录创建文件流
  • 将下载的图片数据复制到文件
  • 刷新并保存文件
  • 返回文件路径

执行更新

await service.UpdateGamesAsync();

调用服务的更新方法,触发游戏数据和相关图片的下载

第二个测试方法:GetGamesTest()

这个测试验证游戏数据的获取和序列化功能:

获取游戏列表

var list = await service.GetGamesAsync();

断言验证

Assert.That(list, Is.Not.Null);
Assert.That(list, Is.Not.Empty);

验证返回的游戏列表不为空且包含数据

数据序列化

await JsonSerializer.SerializeAsync(
    fileStream,
    list,
    options: new JsonSerializerOptions { WriteIndented = true }
);

将游戏列表序列化为格式化的 JSON 文件保存到本地

总结

这个测试类主要用于:

  1. 功能测试:验证 Steam 游戏服务的核心功能
  2. 集成测试:测试图片下载和文件保存的完整流程
  3. 数据导出:将获取的游戏数据导出为 JSON 格式便于分析

代码使用了现代 C# 的异步编程模式,并包含了适当的资源管理(using 语句)和错误处理。

评论加载中...