如何为 System.AppDomain 类创建填充程序

本文关键字:创建 填充 程序 AppDomain System | 更新日期: 2023-09-27 18:32:59

在我的代码中,我正在使用AppDomain.CurrentDomain.BaseDirectory调用。

在我的单元测试中,我想伪造此调用,因此它将始终为BaseDirectory属性返回相同的值。

但是,在为 System 生成假程序集后,我在单元测试中看不到ShimAppDomain。是因为AppDomain sealed class吗?

如何将我的测试与AppDomain.CurrentDomain.BaseDirectory呼叫隔离开来?

用于使用Microsoft Fakes Framework和Visual Studio 2015 Enterprise进行模拟。

如何为 System.AppDomain 类创建填充程序

找到此解决方案

一、mscorlib.fakes更新内容

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic="true">
  <Assembly Name="mscorlib" Version="4.0.0.0"/>
  <StubGeneration>
    <Clear/>
  </StubGeneration>
  <ShimGeneration>
    <Clear/>
    <Add FullName="System.AppDomain"/>
  </ShimGeneration>
</Fakes>

II. 将using System.Fakes添加到我的单元测试文件中

三、在我的单元测试中添加以下内容

using (ShimsContext.Create())
{
    string baseDir = @"My'Base'Dir";
    ShimAppDomain fakeAppDomain = new ShimAppDomain()
    {
        BaseDirectoryGet = () => { return baseDir; }
    };
    ShimAppDomain.CurrentDomainGet = () => { return fakeAppDomain; };
    string defaultDir = MyConstants.DefaultAppFolder;
    // both baseDir and defaultDir are same "My'Base'Dir"
    Assert.AreEqual(baseDir, defaultDir);
}

Constants.DefaultAppFolder属性实现如下

internal static class MyConstants
{
    internal static string DefaultAppFolder
    {
        get
        {
            return AppDomain.CurrentDomain.BaseDirectory;
        }
    }
}

它很冗长,但有效。