プライベートコンストラクタを持ち、public staticメソッド(シングルトンクラス)を介してアクセスするクラスがあります。偽物でこのクラスのシングルトンオブジェクトを作成することはできません。偽のstatic/singletonクラス/メソッドを使ったMicrosoftの偽物
public class MyBusinessManager : BusinessManager
{
private MyBusinessManager objMyBusinessManager;
private MyBusinessManager (MyBusinessManager dvqsDataManager)
{
objMyBusinessManager= dvqsDataManager;
}
public static MyBusinessManager GetInstance() // out
{
MyBusinessManager dvqsDataMgr = new MyBusinessManager();
return new MyBusinessManager (dvqsDataMgr);
}
public bool MyBusinessManagerMethod (int bm)
{
if(bm == 0)
return true;
return false;
}
}
私は次のような方法をテストしたい:この場合には偽のメソッドを呼び出す方法を
[TestClass]
public class MyService_UT
{
[TestMethod]
public void TestMethod1()
{
using (ShimsContext.Create())
{
ShimMyBusinessManager.GetInstance =() => { return new ShimMyBusinessManager(); };
ShimMyBusinessManager.AllInstances.MyServiceMethodInt32 = (a) =>{
return true;
}
MyService obj = new MyService();
Assert.IsTrue(obj.MyServiceMethod(1))// doesn't call fake method
}
}
}
:
public class MyService
{
public bool MyServiceMethod(int serviceParam)
{
MyBusinessManager dvqBusinessManager = MyBusinessManager.GetInstance(); // make fake call
return dvqBusinessManager.MyBusinessManagerMethod(serviceParam); // make fake service call
}
}
私のテストクラスを?このコードで偽のインスタンスを作成できません。
シングルトンが「アンチパターン」である理由の1つを学んだだけです。 – Joe
正しい。これは古いコードです。しかし、どのようにこれを抜け出すために? – user2323308
テストするために厄介なコードの別の層を上に置くのではなく、むしろ厄介な古いコードをリファクタリングする方が簡単かもしれません。 – nvoigt