我有一个"Test"类,它有一个IEnumerable的具体对象
public class Test
{
public IEnumerable<MyObject> MyObjects { get; }
}
public class MyObject
{
public string Id { get; }
public MyObject(
string id,
{
this.Id = id;
}
}
在调试 Specflow 功能文件使用的"Steps.cs"类时,我注意到"Id"的值正在更改。它们在"给定"步骤中符合预期,我将它们添加到场景上下文中
[Given("I have use case (.*)")]
{
var _test = _retrieveTest.GetMyObjects(useCase);
ScenarioContext.Current.Add("test", _test);
}
当我在"何时"步骤中从场景上下文中读出它们时,它们发生了变化
[When("I do something")]
public void WhenIDoSomething()
{
var _test = (MyProject.Entity.Test)ScenarioContext.Current["test"];
}
停止值更改的解决方案是在检索对象时使用 LINQ"ToList((" 调用,如下所示:
private IEnumerable<MyObject> GetMyObjects(
string usecase,
MyProject.Entity.Test test)
{
...
return testData.Objects
.Select(Object => {
var _id = var _id = Guid.NewGuid();
return new MyProject.Entity.MyObject(
_id);
}).ToList();
}
谁能解释为什么有必要调用".ToList(("在这里,没有它,为什么"Id"的值在"给定"和"何时"步骤之间的"场景上下文"中发生变化
不带 .ToList(( 你返回了一个枚举器,每次迭代它时都会执行它。与 .ToList(( 你具体化枚举器并有一个具体的列表。
请参阅 IEnumerable vs List - 使用什么?它们是如何工作的?以获得更详细的答案。