1

更新 1、詳細

私の質問がわかりにくかったです、すみません…。

簡単な質問... Moq で特定の実装をどのようにテストしますか?

interface IShipping
{
    int CalculateCost();
}

class TruckShipping: IShipping
{
    int CalculateCost()
    {
        return 9;
    }
}

class Shipping: IShipping
{
    int CalculateCost()
    {
        return 5;
    }
}

class CalculateSomethingMore
{
    IShipping _shipping;
    CalculateSomethingMore(IShipping shipping)
    {
        // Here I want the TruckShipping implementation!
        _shipping = shipping;
    }
    DoCalc()
    {
        return _shipping.CalculateCost * 2;
    }
 }

モックがなければ、おそらく (DI を使用しない場合) TEST のようになります。

var truckShipping = new TruckShipping();
var advancedCalculation = CalculateSomethingMore(truckShipping);
var result = DoCalc();

var expected = 18;
Assert.IsTrue(result == expected);

NUnit、FluentAssertions、MbUnit、xUnit などは関係ありません :)

テスト: var truckShipping = Mock.Of<IShipping> .... ? TruckShipping の実装をテストしたいと思います。

それを CalculateSomethingMore に注入します。

4

3 に答える 3

1

Moqはテストフレームワークではなく、mockinqフレームワークであるため、テスト機能を提供しません。

テストには、SharpTestExを使用できます。たとえば、次のように記述できます。

[TestMethod]
public void VerifyCostIsCorrect()
{
    new TruckShipping()
        .CalculateCost()
        .Should("The TruckShipping implementation returns a wrong cost.").Be.EqualTo(9);
}
于 2012-06-05T22:58:02.413 に答える
1

モックを使用して、実際の依存関係 (インスタンス化するには複雑すぎることが多い) をの軽量オブジェクトに置き換えます。基本的に、サードパーティのライブラリから自動生成されたコードをテストすることになるため、モックされたオブジェクトをテストすることはまったく意味がありません。

編集

特に IoC と inject を使用していることを考えると、具体的な implementationに依存する理由はまだ不明ですIShipping。とにかく、それ自体ではなく、シミュレートできるものがTruckShipping必要だと思いますTruckShipping。もしそうなら、それは簡単です:

var shippingMock = new Mock<IShipping>();
// setting up mock to return 9 makes it behave as if it was TruckShipping
shippingMock.Stub(s => s.CalculateCost()).Returns(9);
var advancedCalculation = CalculateSomethingMore(shippingMock.Object);

var result = DoCalc();

var expected = 18;
Assert.IsTrue(result == expected);
于 2012-06-05T22:48:10.710 に答える
1

TruckShipping の実装をテストする場合は、実装用に別のテストが必要ですTruckShipping

現在、 の動作をテストしていますCalculateSomethingMore。これは、送料で計算されたコストの 2 倍の値を返す必要があります。どの配送先でもかまいません。の責任はCalculateSomethingMore、その費用について配送業者に尋ね、その費用を 2 倍にすることです。

Mock<IShipping> shipping = new Mock<IShipping>();
shipping.Setup(s => s.CalculateCost()).Returns(10);
CalculateSomethingMore sut = new CalculateSomethingMore(shipping.Object);
Assert.That(20, Is.EqualTo(sut.DoCalc()));
shipping.VerifyAll();

ご覧のとおり、このテストでは送料としても9も使用されていません。5なんで?実際には、それがどのような価値を持つかは気にしないからです。送料の計算は、テスト中のクラスの責任ではありません。

TruckShippingまた、実装には、送料を正しく計算する別のテストが必要ですTruckShipping(これは、配送オブジェクトの責任です)。

TruckShipping sut = new TruckShipping();
Assert.That(9, Is.EqualTo(sut.DoCalc());
于 2012-06-06T11:42:40.010 に答える