2013-05-03 62 views
1

我要驗證一個目標方法中的一個方法被調用以參數的順序,像下面。例如,如何驗證RepairCar()被稱爲與car參數第一,而不是car2驗證方法調用參數,來電訂購

[TestClass] 
    public class TestMethodParam 
    { 
     [TestMethod] 
     public void TestMethod1() 
     { 
      Mock<ICarService> carService = new Mock<ICarService>(MockBehavior.Strict); 

      var car = new Car 
       { 
        Name = "1" 
       }; 

      var car2 = new Car 
      { 
       Name = "2" 
      }; 

      var carManager = new CarManager(carService.Object); 

      //act 
      carManager.Serve(); 

      //assert: 
      carService.Verify(c => c.RepairCar(It.Is<Car>(actualCar => actualCar.Name == car.Name)), Times.Once()); 
      carService.Verify(c => c.RepairCar(It.Is<Car>(actualCar => actualCar.Name == car2.Name)), Times.Once()); 



     } 
    } 

    public interface ICarService 
    { 
     void RepairCar(Car car); 
    } 

    public class Car 
    { 
     public string Name { get; set; } 
    } 


    public class CarManager 
    { 
     private ICarService carService; 

     public CarManager(ICarService carService) 
     { 
      this.carService = carService; 
     } 
     public void Serve() 
     { 
      var car = new Car 
       { 
        Name = "1" 
       }; 

      carService.RepairCar(car); 

      var car2 = new Car 
      { 
       Name = "2" 
      }; 

      carService.RepairCar(car2); 
     } 
    } 

回答

1

我知道實現這一目標的唯一方法是使用回調並使用一些列表來記住呼叫順序。

[TestClass] 
    public class TestMethodParam 
    { 
     [TestMethod] 
     public void TestMethod1() 
     { 
      var repairCarCalls = new List<string>(); 
      Mock<ICarService> carService = new Mock<ICarService>(); 

      var car = new Car 
      { 
       Name = "1" 
      }; 

      var car2 = new Car 
      { 
       Name = "2" 
      }; 

      carService.Setup(c => c.RepairCar(It.IsAny<Car>())).Callback<Car>(c => repairCarCalls.Add(c.Name)); 

      var carManager = new CarManager(carService.Object); 

      //act 
      carManager.Serve(); 

      //assert: 
      var expectedCalls = new[] { car.Name, car2.Name }; 
      CollectionAssert.AreEqual(expectedCalls, repairCarCalls); 
     } 
    }