2013-05-03 59 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); 
     } 
    }