我如何验证两个班级分配给同一城市?

问题描述 投票:0回答:1

如何在C#中验证是否将两个类别(火车和线路)分配给了同一座城市?此测试需要实现。我有三个带界面培训的班:ITrain,线:Iline和城市:ICity。第三个测试是检查火车和线路是否属于同一城市,这主要应在Train类中的方法void AssignTo(ILine l)中进行检查。所有后续测试(从测试3开始)均失败,因为我无法验证火车和线路是否属于同一城市。我需要将引用传递给他方法AssignTo。

    internal class Line : ILine
    {
        private List<Station> _stations;
       
        internal IEnumerable<Train> _trains;

        internal Line(string name, City city)
        {
            this.Name = name;
            this.City = city;
            _stations = new List<Station>();
            _trains = new List<Train>();
          
        }
        public string Name
        {
            get;
        }

        public ICity City
        {
            get;
        }

        public IEnumerable<IStation> Stations
        {
            get
            {
                
                return _stations;
            }
        }

        public IEnumerable<ITrain> Trains
        {
            get
            {
                return _trains;
            }
        }
     }

//the main part of the test 3 shoukd be verified in the method AssignTo

internal class Train : ITrain
    {
        internal Train(string name, Company company)
        {
            this.Name = name;
            this.Company = company;
        }

        public string Name
        {
            get;
        }

        public ICompany Company
        {
            get;
        }

        public ILine Assignment
        {
            get;
            private set;
        }

        public void AssignTo(ILine l)
        {
            //verify cities for T3 
            //if(Assignment == )

            //verify things T4 
            
            //Then T5 should work!

            //Prior test: verify that LINE is not null
            if (Assignment != null && Assignment.Trains.Contains(this))
            {
                //need to remove THIS from l1.trains
                ((List<Train>)Assignment.Trains).Remove(this);
            }

            //Prior test: need to change current line and add train to new line
            ((List<Train>)l.Trains).Add(this);
            Assignment = l;
           
        }
    }

 [Test]
        public void T3_trains_and_lines_must_belong_to_the_same_city()
        {
            ICity s1 = CityFactory.CreateCity("Paris");
            ICompany c1 = s1.AddCompany("SNCF");
            ILine l1 = s1.AddLine("RER A");
            ITrain t1 = c1.AddTrain("RER1");
            ICity s2 = CityFactory.CreateCity("Lyon");
            ICompany c2 = s2.AddCompany("SNCF");
            ILine l2 = s2.AddLine("RER A");
            ITrain t2 = c2.AddTrain("RER1");
            Action action1 = (() => t1.AssignTo(l1));
            action1.ShouldNotThrow();
            Action action2 = (() => t1.AssignTo(l2));
            action2.ShouldThrow<ArgumentException>();
        }
        //Following tests
        [Test]
        public void T4_assigning_a_train_to_a_null_line_removes_its_assignment()
        {
            ICity s1 = CityFactory.CreateCity("Paris");
            ICompany c1 = s1.AddCompany("SNCF");
            ILine l1 = s1.AddLine("RER A");
            ITrain t1 = c1.AddTrain("RER1");
            Action action1 = (() => t1.AssignTo(null));
            action1.ShouldNotThrow();
            t1.AssignTo(l1);
            t1.Assignment.Should().BeSameAs(l1);
            t1.AssignTo(null);
            t1.Assignment.Should().BeNull();
            l1.Trains.Count().Should().Be(0);
        }
        [Test]
        public void T5_line_can_have_mutiple_trains()
        {
            ICity s1 = CityFactory.CreateCity("Paris");
            ICompany c1 = s1.AddCompany("SNCF");
            ILine l1 = s1.AddLine("RER A");
            ITrain t1 = c1.AddTrain("RER1");
            ITrain t2 = c1.AddTrain("RER2");
            t1.AssignTo(l1);
            t2.AssignTo(l1);
            l1.Trains.Count().Should().Be(2);
            l1.Trains.Should().Contain(t1);
            l1.Trains.Should().Contain(t2);
            t1.AssignTo(null);
            l1.Trains.Single().Should().BeSameAs(t2);
        }

void AssignTo(ILine l);

第三项测试正在检查火车和线路是否属于同一城市。

c# ienumerable multiple-inheritance assign object-class
1个回答
0
投票

[我认为这是指:只要将火车辅助到1号线,然后分配更改为2号线,则2号线必须与1号线在同一城市。

这可能被类似的东西捕获:

if (!(Assignment.City == l.City))  throw new ArgumentException(...);

似乎还允许使用null值,因此将进行更完整的检查

if (!(Assignment == null || l == null || Assignment.City == l.City)) throw...

请注意,这将允许通过以下方式将火车传送到另一个城市:>

train1.AssignTo(lineInCity1);
train1.AssignTo(null);
train1.AssignTo(lineInCity2);

要求未指定是否应允许。

© www.soinside.com 2019 - 2024. All rights reserved.