测试数组的最小起订量 class

Moq with testing an array class

我需要一种正确的方法来测试我的 classes,我对任何模拟框架都很陌生

我有下面的测试 class 我正在使用带最小起订量的 Nunit。我对如何在进行如下调用时传递 carconfigs 数组感到困惑。

[TestFixture]
    public class RaceCarSetupSelectorTest
    {
        private  CarConfiguration _carConfiguration;
        private  RaceCarSetupSelector _raceTrack;
        private  Mock<IRankCalculator> _mockRankCalcultor;        

        [SetUp]
        public void SetUp()
        {
            _mockRankCalcultor = new Mock<IRankCalculator>();  
            _raceTrack = new RaceCarSetupSelector(_mockRankCalcultor.Object);
        }

        [Test]       
        public void RankingCarConfigurationsTest()
        {
            IList<CarConfiguration> carConfigs = new List<CarConfiguration>();
            carConfigs.Add(FakeCarConfigs.Bentley);
            carConfigs.Add(FakeCarConfigs.Jaguar);
            carConfigs.Add(FakeCarConfigs.Maruti);
            carConfigs.Add(FakeCarConfigs.Nissan);
            carConfigs.Add(FakeCarConfigs.Porsche);

            _mockRankCalcultor.Verify(x=>x.RankConfigurations(It.IsAny<RaceTrack>,It.IsAny<List<CarConfiguration>>)).

        }
    }

基本上我想测试 IRankCalculator 接口中定义的 RankConfiguration 方法。

我有两个实体 RaceTrack 和 CarConfiguration,我必须根据一些输入对汽车配置进行排名。我有一个 RankCalculator class,其中实际的计算方法如下所示,它派生自 IRankCalculator 接口。

 public CarConfiguration[] RankConfigurations(RaceTrack raceTrack, CarConfiguration[] configs)
        {
         //code for calculation

          return configs[];

        }

我有一个名为 RaceCarSetupSelector 的不同 class,它的作用类似于调用 RankCalculator class 中的方法的服务 class。所以我为 class 'RaceCarSetupSelector ' 写了一个测试。希望这次我说清楚了。

第一件事是您不想模拟实际的 class 测试中您想要模拟它的依赖项。您需要创建实现您的 IRankCalculator 的 class 的具体实例并进行测试。

那么下一个问题是你想用那个方法测试什么?

Basically I want to test the RankConfiguration method which is defined in IRankCalculator interface.

这意味着被测系统 (SUT) 是 RankCalculator class,您要确保它正确计算排名。但是,在您的示例代码中,您没有使用 RankCalculator,您使用的是 IRankCalculator 的模拟。要测试 RankCalulator 你会做类似

// Arrange
var raceTrack = new FakeRaceTrack();
var carConfigs = new List<CarConfiguration> {FakeCarConfigs.Bentley, FakeCarConfigs.Jaguar, ...};
var rankCalculator = new RankCalculator();    // SUT

// Act
var ranks = rankCalculator.RankConfigurations(raceTrack, carConfigs);

// Assert
Assert.That(ranks.First(), Is.EqualTo(FakeCarConfigs.Jaguar));

看起来您正在尝试测试 RaceCarSetupSelector class 以确保它在某个时刻调用 IRankCalculator 上的 RankConfiguration()(行为验证)。您快完成了,但您的测试似乎缺少您尝试测试的实际方法调用。我想它应该看起来像

// Arrange
var raceTrack = new FakeRaceTrack();
var carConfigs = new List<CarConfiguration> {FakeCarConfigs.Bentley, FakeCarConfigs.Jaguar, ...};
var mockRankCalcultor = new Mock<IRankCalculator>();  
var setupSelector = new RaceCarSetupSelector(mockRankCalcultor.Object);    // SUT

// Act
setupSelector.DoSomething(raceTrack, carConfigs);

// Assert
mockRankCalcultor.Verify(x => x.RankConfigurations(raceTrack, carConfigs);