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 测试代码的功能与行为(中文):

总体

  • 这是一个 NUnit 测试类(标注 [TestFixture]),类名 SteamGameTest,继承自 Basic(推测 Basic 提供了依赖注入的 ServiceProvider)。
  • 引用了 System.IO 和 System.Text.Json,用于文件读写和 JSON 序列化。
  • 两个测试方法都是异步的(返回 Task),并用 [Test] 标注。

UpdateTest 方法

  • 从依赖注入容器获取 ISteamGameService:如果为 null 则抛出异常,保证测试前置条件。
  • 为 service 的三个下载完成事件注册异步处理器:
    • OnLogoDownloadComplete
    • OnAchievementIconDownloadComplete
    • OnAchievementIconGrayDownloadComplete
  • 每个事件处理器的行为基本相同:
    • 接收一个 Stream(以及其他未使用或被命名为 _ 的参数),在路径 D:\localDevTemp\Stream\ 下创建一个以 Guid.NewGuid():N(不含短横线的 GUID)为名的文件,使用 FileMode.Create、FileAccess.Write。
    • 将传入的 stream 异步复制到刚创建的 fileStream(await stream.CopyToAsync(fileStream)),然后 FlushAsync,最后返回文件名(fileStream.Name)。
    • 使用 await using 确保 FileStream 在完成后正确释放。
  • 最后调用 await service.UpdateGamesAsync():这通常会触发从远端获取或更新游戏数据并在过程中引发上述下载完成事件,从而把下载到的数据(logo、成就图标等)保存到本地文件。

GetGamesTest 方法

  • 同样先从容器获取 ISteamGameService(非空检查)。
  • 调用 await service.GetGamesAsync() 获取游戏列表(一个集合)。
  • 断言结果不为 null 且不为空(Assert.That)。
  • 将结果序列化为 JSON 文件,写到 D:\work\temp data\steam_data.json:
    • 使用 FileStream(FileMode.Create, FileAccess.Write) 创建/覆盖目标文件。
    • 使用 JsonSerializer.SerializeAsync 把 list 序列化到流,JsonSerializerOptions 设置 WriteIndented = true(美化缩进)。
    • FlushAsync 确保数据写入磁盘。
  • 同样使用 await using 确保 FileStream 被释放。

补充说明 / 注意点

  • 事件处理器将下载的数据写入硬编码的本地路径(D:...),在不同环境下可能需要修改或确保目录存在与有写权限。
  • 文件名使用 GUID 来避免冲突,但没有清理机制,可能会残留临时文件。
  • 代码假定事件处理器应返回文件路径(从返回值来看),因此事件委托可能是一个返回 Task 的异步回调。
  • 这些测试侧重于集成级别(依赖外部下载/IO),不是纯粹的单元测试,执行时可能需要网络和外部资源。

如果你想,我可以进一步解释每个事件委托的可能签名、如何改造为更可控的单元测试,或如何改进临时文件管理与错误处理。

评论加载中...