41

こんにちは、私は Moq フレームワークが初めてで、使用方法についていくつか質問があります。例を挙げて、答えを期待します。

インターフェイスと実装の 2 つのクラスがあります。

public class Vehicle{
   public string RegistrationNumber {get; set;}
   public long VehicleIdentifier { get; set; }
   public Tyre TyreSpecification { get; set; }
}

public class Tyre {
    public long NumberOfTyres {get; set;}
    public long TyreSize { get; set;}
}

public interface ISelecter {
   Vehicle GetVehicleByRegistrationNumber(string registrationNumber);
   Tyre GetTyreSpecification(long vehicleIdentifier);
}

public class Selecter : ISelecter
{
    public Vehicle GetVehicleByRegistrationNumber(string registrationNumber)
    {
        var vehicle = 'Database will give us the vehicle specification';

        //Then we do things with the vehicle object

        //Get the tyre specification
        vehicle.TyreSpecification = GetTyreSpecification(vehicle.VehicleIdentifier);

        return vehicle;

    }

    public Tyre GetTyreSpecification(long vehicleIdentifier)
    {
         var tyre = 'external manufacture system gets the tyre specification';

         //Then do thing with the tyre before returning the object


         return tyre;
    }
}

これらのメソッドに対して 2 つのテストを書きたいと思います。GetVehicleByRegistrationNumber問題は、へのメソッド呼び出しをモックする方法がわからないためのテストを作成するときですGetTyreSpecification

テスト メソッドは次のようになります。

[TestClass]
public class SelecterTest
{
    [TestMethod]
    public void GetTyreSpecification_test()
    {
        //Arrange
        var tyre = new Tyre { NumberOfTyres = 4, TyreSize = 18 };

        var mockSelecter = new Mock<ISelecter>();
        mockSelecter.SetUp(s=>s.GetTyreSpecification(It.IsAny<long>())).Returns(tyre);

        //Act
        var tyreSpec = mockSelecter.Object.GetTyreSpecification(123456);

        //Assert
        Assert.IsTrue(tyreSpec.NumberOfTyres == 4 && tyreSpec.TyreSize == 18);
    }

    [TestMethod]
    public void GetVehicleByRegistrationNumber_test()
    {
        //Arrange
        var vehicle= new Vehicle { VehicleIdentifier = 123456, RegistrationNumber = ABC123, TyreSpecification = new Tyre { Tyresize = 18, NumberOfTyres = 4 }};

        var mockSelecter = new Mock<ISelecter>();
        mockSelecter.SetUp(s=>s.GetVehicleByRegistrationNumber(It.IsAny<string>     ())).Returns(vehicle);

        //Act
        var vehicle = mockSelecter.Object.GetVehicleByregistrationNumber(123456);

        //Assert
        Assert.IsTrue(vehicle.Registrationnumber == "ABC123";
    }
}

テストメソッドGetVehicleByRegistrationNumber_testで、への呼び出しをどのようにモックしますgetTyreSpecificationか?

4

4 に答える 4

26

テストしようとしているクラスのメソッドをモックしようとするべきではありません。モッキング フレームワークは、クラスが取り込んだ依存関係に対する実際の呼び出しを偽の呼び出しに置き換えるために使用されます。これにより、クラスの外部依存関係に気を取られることなく、クラスの動作のテストに集中できます。

クラスによって取り込まれる外部依存関係がないSelecterため、何もモックする必要はありません。実際のコード自体をテストしてテストする必要がない場合は、モックを作成しないことを常にお勧めします。明らかに、テストをアトミックに保つには、外部依存関係がある場合は呼び出しをモックする必要があります。

于 2013-05-14T08:19:47.073 に答える
6

一般に、単体テストを作成するクラス内で使用される外部依存関係/他のオブジェクト/インターフェイス呼び出しにはモックを使用します。したがって、同じクラス内の別の関数を内部的に呼び出す関数の 1 つのテストを作成している場合、その関数呼び出しをモックする必要はありません。ただし、内部関数で外部インターフェイスを呼び出す場合は、外部インターフェイス インスタンスをモックし、期待される結果で単体テストを作成する必要があります。

于 2018-01-28T06:55:50.860 に答える
-2
 var mockSelecter = new Mock<ISelecter>{ CallBase = true };
 mockSelecter.SetUp(s=>s.GetTyreSpecification(It.IsAny<long>())).Returns(tyre);
于 2016-12-28T15:47:37.113 に答える