2

次のコードがあるとします。

public class NumberClass
{
    public NumberClass()
    {
        DefaultNumber = 1;
    }
    public int DefaultNumber{set;get;}
}

public static class NumberSetup
{
    public static NumberClass GetDefaultNumber()
    {
        return new NumberClass();
    }
}

public class NumberSetupImplementation
{
    int FinalNumber;
    public void IncreaseNumber(int currentNumber)
    {
        FinalNumber = currentNumber + NumberSetup.GetDefaultNumber().DefaultNumber;
    }
}

c#.net で moq.mock を使用してメソッドをテストしたいのですNumberSetupImplementation.IncreaseNumberが、直面している問題は、メソッドが静的メソッドを呼び出していることです。

私はこれを読みましたが、私の場合にそれを実装する方法がわかりません

4

2 に答える 2

1

Moq は内部で動的プロキシを使用するため、Moq を使用して静的メソッドをモックすることはできません。テスト容易性を考慮して設計するためのポイントの 1 つは、静的メソッドを使用しないことです。あなたの例では、DIを使用して注入するNumberSetupか、別のトリックは2つのコンストラクターを使用することです:

public interface INumberSetup
{
    NumberClass GetDefaultNumber();
}

public class NumberSetup: INumberSetup 
{ 
    public NumberClass GetDefaultNumber() 
    { 
        return new NumberClass(); 
    } 
} 

public class NumberSetupImplementation 
{ 
    private int _finalNumber;
    private INumberSetup _numberSetup;

    public NumberSetupImplementation()
        : this(new NumberSetup())
    {}

    public NumberSetupImplementation(INumberSetup numberSetup)
    {
        _numberSetup = numberSetup;
    }

    public void IncreaseNumber(int currentNumber) 
    { 
        _finalNumber = currentNumber + _numberSetup.GetDefaultNumber().DefaultNumber; 
    } 
}
于 2012-09-07T06:29:08.763 に答える
1

Moq のメリットを利用するには、コードを適切に設計する必要があります。

一般に、これは広範な IoC と、アプリケーションのレイヤーを明確に分離することを意味します。Moq が存在する主な理由は、深い依存関係を排除して、作成したものをコンテキストから独立してテストすることに集中できるようにすることです。Moqの有無にかかわらず、それは少し簡単になります。

于 2012-09-07T03:46:19.367 に答える