MSTest 語法紀錄

Unit Test, MSTest

單元測試範例

using Microsoft.Extensions.Configuration;
using Vista.DbPanda;

namespace TestPanda;

[TestClass]
public class UnitTest1 : TestBase
{
  [TestMethod("同步連接DB")]
  public void TestMethod1()
  {
    var connString = Configuration.GetConnectionString("DefaultConnection");
    Assert.IsNotNull(connString);
    var proxy = new ConnProxy(connString);
    using var conn = proxy.Open();
  }

  [TestMethod("非同步連接DB")]
  public async Task TestMethod2()
  {
    var connString = Configuration.GetConnectionString("DefaultConnection");
    Assert.IsNotNull(connString);
    var proxy = new ConnProxy(connString);
    using var conn = await proxy.OpenAsync();
  }
}

另一個案例

using Vista.Models;

namespace ZPlaywrightTestProject;

[TestClass]
public class UnitTest_Vista_DB_Utils
{
  [TestMethod]
  public void Test_Clsx()
  {
    Assert.AreEqual("foo",
      Utils.Clsx("foo", true));

    Assert.AreEqual("",
      Utils.Clsx("foo", false));

    Assert.AreEqual("base foo",
      Utils.Clsx("base", "foo", true));

    Assert.AreEqual("base",
      Utils.Clsx("base", "foo", false));

    Assert.AreEqual("base base2 foo bar",
      Utils.Clsx("base base2", ("foo", true), ("bar", true)));

    Assert.AreEqual("base base2 bar",
      Utils.Clsx("base base2", ("foo", false), ("bar", true)));

    Assert.AreEqual("base base2",
      Utils.Clsx("base base2", ("foo", false), ("bar", false)));

    Assert.AreEqual("",
      Utils.Clsx(null!, ("foo", false)));

    Assert.AreEqual("foo show-me",
      Utils.Clsx(null!, ("foo", true), "show-me"));

    //Class=@Utils.Clsx(("mud-input-required", Required), Class!)
    Assert.AreEqual("mud-input-required show-me",
      Utils.Clsx(("mud-input-required", true), "show-me"));

    Assert.AreEqual("mud-input-required",
      Utils.Clsx(("mud-input-required", true), null!));

    Assert.AreEqual("show-me",
      Utils.Clsx(("mud-input-required", false), "show-me"));

    Assert.AreEqual("",
      Utils.Clsx(("mud-input-required", false), null!));
  }

  [TestMethod]
  public void Test_UrlCombine()
  {
    Assert.AreEqual("http://foo.com/",
      Utils.UrlCombine("http://foo.com/"));

    Assert.AreEqual("http://foo.com/foo/bar/baz",
      Utils.UrlCombine("http://foo.com", "foo", "bar", "baz"));

    Assert.AreEqual("http://foo.com/foo/bar/baz/",
      Utils.UrlCombine("http://foo.com/", "/foo/", "/bar/", "/baz/"));

    Assert.AreEqual("http://foo.com/foo/baz",
      Utils.UrlCombine("http://foo.com", "foo", null!, "baz"));

    Assert.AreEqual("http://foo.com/foo/baz",
      Utils.UrlCombine("http://foo.com", "foo", string.Empty, "baz"));

    Assert.AreEqual("http://foo.com/foo/baz",
      Utils.UrlCombine("http://foo.com", "foo", "", "baz"));

    Assert.AreEqual("http://foo.com/foo",
      Utils.UrlCombine("http://foo.com", "foo", string.Empty));
  }

}

商業邏輯測試範例

using Microsoft.Extensions.DependencyInjection;
using Vista.Biz.DEMO;
using Vista.Models;

namespace ZPlaywrightTestProject;

[TestClass]
public class BizTest_DEMO009Biz : BizTestBase // ※有基礎類別
{
  [TestMethod]
  public void Test_QryDataList()
  {
    var bizSvc = scope.ServiceProvider.GetRequiredService<DEMO009Biz>();
    var dataList = bizSvc.QryDataList(new DEMO009QryArgs());
    Assert.IsTrue(dataList.Count > 0);
  }

  [TestMethod]
  public void Test_QryDataList2()
  {
    Assert.AreEqual("foo", "foo");
  }
}

class ATestUser : IAuthUser
{
  public AuthUser? GetCurrentUser()
  {
    return new AuthUser
    {
      UserId = "itest",
      UserName = "艾測試",
      AuthMenu = new()
    };
  }

  public Task<AuthUser?> GetCurrentUserAsync()
  {
    return Task.FromResult(this.GetCurrentUser());
  }
}

安裝套件Microsoft.Extensions.Configuration.Json以讀取appsettings.json組態檔。

PM> NuGet\Install-Package Microsoft.Extensions.Configuration.Json
BizTestBase.cs
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Vista.Biz.DEMO;
using Vista.Models;

namespace ZPlaywrightTestProject;

/// 把測試需要的共用資料統一處理
[TestClass]
public abstract class BizTestBase
{
  // singleton
  protected static IConfigurationRoot config = default!;
  protected static ServiceProvider serviceProvider = default!;

  // scope
  protected IServiceScope scope = default!;

  [AssemblyInitialize]
  public static void AssemblyInitialize(TestContext testContext)
  {
    //# 可自 appsettings.json 取測試組態參數
    // 需安裝套件: Microsoft.Extensions.Configuration.Json。
    var configBuilder = new ConfigurationBuilder()
      .SetBasePath(AppContext.BaseDirectory)
      .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

    config = configBuilder.Build();

    //# 註冊 DB 連線
    Vista.DB.DBHelper.CONNSEC = new Vista.DbPanda.ConnProxy(config.GetConnectionString("DefaultConnection")!);

    //# 註冊 DI 服務
    var services = new ServiceCollection();
    services.AddLogging();
    //services.AddSingleton<IConfiguration>(config);
    services.AddScoped<IAuthUser, ATestUser>();
    services.AddScoped<DEMO009Biz>();

    //# 引入 AOP 
    serviceProvider = services.BuildServiceProvider();
    Vista.Biz.AOP.ServiceActivator.Configure(serviceProvider);
  }

  [AssemblyCleanup]
  public static void AssemblyCleanup()
  {
    serviceProvider?.Dispose();
    serviceProvider = null!;
  }

  /// <summary>
  /// 每個測試都會跑一次啟用
  /// </summary>
  [TestInitialize()]
  public void TestInitialize()
  {
    scope = serviceProvider.CreateScope();
  }

  /// <summary>
  /// 每個測試都會跑一次清除
  /// </summary>
  [TestCleanup()]
  public void TestCleanup()
  {
    scope?.Dispose();
    scope = null!;
  }
}

(EOF)

Last updated