如何在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);
第三项测试正在检查火车和线路是否属于同一城市。
[我认为这是指:只要将火车辅助到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);
要求未指定是否应允许。