2017-11-02 6 views
0

私は静的メソッド内で通常のメソッドを模擬する必要がありますC#で静的クラスの中で通常のメソッドをモックする方法は?

私のメソッドは、このようなもので、ここでTestResultを模擬することは可能ですか?

私はクラスが静的にする必要がないこと

public static ClassData() 
{ 

     public static string GetData() 
     { 
      //Wish to mock TestResult method 
      TestData TD=new TestData(); 
      string FinalResult=TD.TestResult(); 
      //Some logic 
      Return FinalResult; 
     } 


} 

答えて

-2

インタフェースを使用してメソッド内メソッドをあざけるで行うが、ここでは静的メソッドいます。静的でないクラスの中に静的メソッドを持たせることができます。その後、静的メソッドは非静的メソッドを呼び出すことができます。

+1

これは質問に答えますか? – Evk

+0

はい。投稿されたコードをテストした場合、元のコードのエラーが認識されます。 – jdweng

+1

私はdownvoteをしませんでしたが、私はそれがどのように答えるか分かりません。 OPは静的な 'GetData'メソッドを変更せずに' TestData'クラスの 'TestResult()'呼び出しをモックしようとしています。あなたの答えが何らかの形でそれに関連しているのを見ないでください。 – Evk

0

答えは「いいえ、既存のコードを変更せずにモックする方法はありません」です。

単体テストでコードをカバーできないという事実は、コード自体に何らかの問題があることを示す証拠となります。だから私は本当にアプローチを再訪することをお勧めします。

これが実用的でない場合は、次のトリックを試すことができます。 (あなたがテストコードで設定のだ)公共セッターを持つプロパティとしてTestDataを公開:

public static class ClassData 
{ 

    public static string GetData() 
    { 
     //Wish to mock TestResult method 
     TestData TD = new TestData(); 
     string FinalResult = TestData.TestResult(); 
     //Some logic 
     return FinalResult; 
    } 

    public static TestData TestData { private get; set; } 
} 

public class TestData 
{ 
    public virtual string TestResult() 
    { 
     return string.Empty; 
    } 
} 

試験体のジャストアイデア:

var testDataMock = new Mock<TestData>(); // Moq as example 
testDataMock.Setup(t => t.TestResult()).Returns("some string"); 
ClassData.TestData = testDataMock.Object; 
var result = ClassData.GetData(); 

//Assertions 
+0

FakeITeasy経由で同じことを行うには? – Shan

+0

私はFakeItEasyで一度も働いたことはありませんが、グーグルでは短いリンクがありますhttps://www.stevefenton.co.uk/2014/12/nsubstitute-vs-moq-vs-fakeiteasy-vs-rhino/ – Artem

+0

moq実際のデータを模擬した例がありますか? TestDataの空の文字列の代わりにいくつかのデータを返す方法? – Shan

0

は二つの部分に現在の機能を分割:あなたのテストケースで

public static ClassData() 
{ 
    public static string GetData() 
    { 
     //Wish to mock TestResult method 
     TestData TD=new TestData(); 
     string FinalResult=TD.TestResult(); 
     return GetData2(FinalResult); 
    } 
    public static string GetData2(string FinalResult) 
    { 
     //Some logic 
     return FinalResult; 
    }  
} 

、代わりにGetDataGetData2を呼び出し、そして今、あなたは適切な入力値を使用して、「いくつかのロジックを」テストすることができます。

属性を使用すると、GetData2internalになることに注意してください。

0

Isolator使用して、あなただけで行うことができます。

public static class ClassData 
    { 
     public static string GetData() 
     { 
      //Wish to mock TestResult method 
      TestData td = new TestData(); 
      string finalResult = td.TestResult(); 
      //Some logic 
      return finalResult; 
     } 

    } 

    [TestMethod, Isolated] 
    public void Test_MockFinalResult() 
    { 
     var fakeTestData = Isolate.Fake.NextInstance<TestData>(); 
     Isolate.WhenCalled(() => fakeTestData.TestResult()).WillReturn("test"); 
     var str = ClassData.GetData(); 
     Assert.AreEqual("test",str); 
    } 

それとも、心の中で何かを持っていたのですか?

関連する問題