解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
大石头 authored at 2018-05-15 21:21:05
2.95 KiB
X
using System;
using System.Threading;
using System.Threading.Tasks;
using NewLife.Caching;
using NewLife.Model;
using Xunit;

namespace XUnitTest.Model
{
    public class HostTests
    {
        [Fact]
        public async Task TestHost()
        {
            var services = ObjectContainer.Current;

            var cache = MemoryCache.Instance;
            services.AddSingleton<ICache>(cache);

            services.AddTransient<RedisService>();
            services.AddTransient<DbService>();

            var host = services.BuildHost();
            host.Add<MyService>();

            var task = host.RunAsync();
            // 模拟 Wait(3s) 语义:超时不抛异常,继续执行(后续断言自然失败)
            await Task.WhenAny(task, Task.Delay(3_000));

            var host2 = host as Host;
            Assert.NotNull(host2);
            Assert.Single(host2.HostedServices);

            var my = host2.HostedServices[0] as MyService;
            Assert.NotNull(my);
            Assert.Equal(99, my.DbCount);
            Assert.True(my.CacheCount > 0);
        }

        private class MyService : IHostedService
        {
            private readonly DbService _dbService;
            private readonly RedisService _redisService;

            public Int32 DbCount => _dbService.Count;
            public Int32 CacheCount => _redisService.Count;

            public MyService(DbService dbService, RedisService redisService)
            {
                _dbService = dbService;
                _redisService = redisService;
            }

            public async Task StartAsync(CancellationToken cancellationToken)
            {
                await Task.Yield();

                _dbService.Init();
                _redisService.InitRedis();
            }

            public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
        }

        private class DbService
        {
            public Int32 Count { get; set; }

            public void Init()
            {
                // 配置
                var set = NewLife.Setting.Current;
                if (set.IsNew)
                {
                    // 仅模拟“首次运行初始化配置并落盘”,不能改写 DataPath 等决定全局工作目录的字段:
                    // 它们会被保存进 Core.config 并被后续用例(如 SevenZip/TarFile)读取,
                    // 一旦指向输出目录之外,多个目标框架并行运行时会共用同一批临时文件而互相破坏
                    set.Save();
                }

                Count = 99;
            }
        }

        private class RedisService
        {
            private readonly ICache _cache;

            public Int32 Count { get; set; }

            public RedisService(ICache cache) => _cache = cache;

            public void InitRedis()
            {
                _cache.Set("Name", "Stone", 3600);
                Count = _cache.Count;
            }
        }
    }
}