星空网 > 软件开发 > ASP.net

ASP.NET 系列:单元测试之StructureMap

ASP.NET使用StructureMap等依赖注入组件时最重要就是EntityFramework的DbContext对象要保证在每次HttpRequest只有一个DbContext实例,这里将使用第三方提供的HttpSimulator进行测试。

1.定义IDependency接口

创建屏蔽不同依赖注入组件使用差别的接口。

public interface IDependency{  void Build();  void EndRequest();  void AddTransient(Type from, Type to, object instance = null);  void AddScoped(Type from, Type to, object instance = null);  void AddSingleton(Type from, Type to, object instance = null);  object GetInstance(Type type);  IEnumerable GetAllInstances(Type type);}

2.提供StructureMap的适配类StructureMapAdapter

public class StructureMapAdapter : IDependency, IDisposable{  private bool _disposed = false;  private Container _container;  private Registry _registry;  public StructureMapAdapter()  {    this._registry = new Registry();  }  public void Build()  {    _container = new Container(_registry);  }  public void EndRequest()  {    HttpContextLifecycle.DisposeAndClearAll();  }  public void AddTransient(Type from, Type to, object instance = null)  {    if (instance == null)    {      _registry.For(from).Use(to).LifecycleIs<TransientLifecycle>();    }    else    {      _registry.For(from).Use(instance).LifecycleIs<TransientLifecycle>();    }  }  public void AddScoped(Type from, Type to, object instance = null)  {    if (instance == null)    {      _registry.For(from).Use(to).LifecycleIs<HttpContextLifecycle>();    }    else    {      _registry.For(from).Use(instance).LifecycleIs<HttpContextLifecycle>();    }  }  public void AddSingleton(Type from, Type to, object instance = null)  {    if (instance == null)    {      _registry.For(from).Use(to).LifecycleIs<SingletonLifecycle>();    }    else    {      _registry.For(from).Use(instance).LifecycleIs<SingletonLifecycle>();    }  }  public object GetInstance(Type type)  {    return _container.GetInstance(type);  }  public IEnumerable GetAllInstances(Type type)  {    return _container.GetAllInstances(type);  }  public void Dispose()  {    Dispose(true);    GC.SuppressFinalize(this);  }  protected virtual void Dispose(bool disposing)  {    if (!_disposed)    {      if (disposing)      {        this._container.Dispose();      }      _disposed = true;    }  }}

3.使用HttpSimulator进行单元测试

public class StructureMapAdapterTest{  [Fact]  public void TransientTest()  {    IDependency dependency = new StructureMapAdapter();    dependency.AddTransient(typeof(ITest), typeof(Test));    dependency.Build();    var version1 = ((ITest)dependency.GetInstance(typeof(ITest))).Version;    var version2 = ((ITest)dependency.GetInstance(typeof(ITest))).Version;    Assert.NotEqual(version1, version2);  }  [Fact]  public void SingletonTest()  {    IDependency dependency = new StructureMapAdapter();    dependency.AddSingleton(typeof(ITest), typeof(Test));    dependency.Build();    var version1 = ((ITest)dependency.GetInstance(typeof(ITest))).Version;    var version2 = ((ITest)dependency.GetInstance(typeof(ITest))).Version;    Assert.Equal(version1, version2);  }  [Fact]  public void ScopedTest()  {    var version1 = "";    var version2 = "";    using (HttpSimulator simulator = new HttpSimulator())    {      IDependency dependency = new StructureMapAdapter();      dependency.AddScoped(typeof(ITest), typeof(Test));      dependency.Build();      simulator.SimulateRequest(new Uri("http://localhost/"));      version1 = ((ITest)dependency.GetInstance(typeof(ITest))).Version;      version2 = ((ITest)dependency.GetInstance(typeof(ITest))).Version;      Assert.Equal(version1, version2);    }    using (HttpSimulator simulator = new HttpSimulator())    {      IDependency dependency = new StructureMapAdapter();      dependency.AddScoped(typeof(ITest), typeof(Test));      dependency.Build();      simulator.SimulateRequest(new Uri("http://localhost/"));      version1 = ((ITest)dependency.GetInstance(typeof(ITest))).Version;    }    using (HttpSimulator simulator = new HttpSimulator())    {      IDependency dependency = new StructureMapAdapter();      dependency.AddScoped(typeof(ITest), typeof(Test));      dependency.Build();      simulator.SimulateRequest(new Uri("http://localhost/"));      version2 = ((ITest)dependency.GetInstance(typeof(ITest))).Version;    }    Assert.NotEqual(version1, version2);  }}public interface ITest{  String Version { get; }}public class Test : ITest{  private string _version = Guid.NewGuid().ToString();  public string Version { get { return this._version; } }}

运行结果:

ASP.NET 系列:单元测试之StructureMap




原标题:ASP.NET 系列:单元测试之StructureMap

关键词:ASP.NET

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

电商市场排名:https://www.goluckyvip.com/tag/2606.html
The Row:https://www.goluckyvip.com/tag/26060.html
The Sill:https://www.goluckyvip.com/tag/26061.html
The Stretch Suit:https://www.goluckyvip.com/tag/26062.html
The Stryze Group:https://www.goluckyvip.com/tag/26063.html
The Tie Bar:https://www.goluckyvip.com/tag/26064.html
独家丨B站广告位可跳转美团APP B站为电商平台引流再升级 :https://www.kjdsnews.com/a/1836410.html
百崖大峡谷生态旅游景区(探秘中国西南自然风光):https://www.vstour.cn/a/363176.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流