如何使用 NSubstitute 为 IEnumerable class 设置 return 值
How to set the return value for an IEnumerable class using NSubstitute
我有这个域名:
public class ADomainClass
{
public int Id { get; set; }
}
public interface IMyClass : IEnumerable<ADomainClass>
{
}
public class MyClass : IMyClass
{
public IEnumerator<ADomainClass> GetEnumerator()
{
IList<ADomainClass> list = new List<ADomainClass>();
//list = GetData...();
foreach (var item in list)
{
yield return item;
}
}
...
}
并想要构建以下测试:
[Test]
public void TestSample()
{
//Arrange
IMyClass myclass = Substitute.For<IMyClass>();
IList<ADomainClass> testdata = new List<ADomainClass>()
{
new ADomainClass(){ Id = 1, },
new ADomainClass(){ Id = 2, },
new ADomainClass(){ Id = 3, },
new ADomainClass(){ Id = 4, },
};
int count = 0;
myclass.ReturnsForAnyArgs(testdata); //How to set the "return" value?
//Act
foreach (ADomainClass item in myclass)
{
count++;
}
//Assert
count.Should().Be(testdata.Count);
}
为方法设置 return 值很简单,如下所示:
myclass.GetData().Returns(data);
当 return 值是可枚举的 class 时,我不记得如何设置它了。我以前解决过一次,但不记得在哪里用过。
您只需告诉您的替代者 return 来自您测试数据的调查员:
myclass.GetEnumerator().Returns(testdata.GetEnumerator());
我的问题是 NSubstitute 存储枚举的状态,因此如果您在被测系统中使用 Enumerator 两次,它将在第二次继续使用第二个元素。我正在使用类似下面代码的方法作为解决方法(使用 lambda 而不是返回枚举器,第 1 + 2 行仅用于演示)。我只用一些 Linq 和 foreach 对此进行了测试。
var bar = new List<string> { "a", "b", "c" };
var foo = Substitute.For<ICollection<string>>();
foo.GetEnumerator().Returns((ci) => { return bar.GetEnumerator(); });
我有这个域名:
public class ADomainClass
{
public int Id { get; set; }
}
public interface IMyClass : IEnumerable<ADomainClass>
{
}
public class MyClass : IMyClass
{
public IEnumerator<ADomainClass> GetEnumerator()
{
IList<ADomainClass> list = new List<ADomainClass>();
//list = GetData...();
foreach (var item in list)
{
yield return item;
}
}
...
}
并想要构建以下测试:
[Test]
public void TestSample()
{
//Arrange
IMyClass myclass = Substitute.For<IMyClass>();
IList<ADomainClass> testdata = new List<ADomainClass>()
{
new ADomainClass(){ Id = 1, },
new ADomainClass(){ Id = 2, },
new ADomainClass(){ Id = 3, },
new ADomainClass(){ Id = 4, },
};
int count = 0;
myclass.ReturnsForAnyArgs(testdata); //How to set the "return" value?
//Act
foreach (ADomainClass item in myclass)
{
count++;
}
//Assert
count.Should().Be(testdata.Count);
}
为方法设置 return 值很简单,如下所示:
myclass.GetData().Returns(data);
当 return 值是可枚举的 class 时,我不记得如何设置它了。我以前解决过一次,但不记得在哪里用过。
您只需告诉您的替代者 return 来自您测试数据的调查员:
myclass.GetEnumerator().Returns(testdata.GetEnumerator());
我的问题是 NSubstitute 存储枚举的状态,因此如果您在被测系统中使用 Enumerator 两次,它将在第二次继续使用第二个元素。我正在使用类似下面代码的方法作为解决方法(使用 lambda 而不是返回枚举器,第 1 + 2 行仅用于演示)。我只用一些 Linq 和 foreach 对此进行了测试。
var bar = new List<string> { "a", "b", "c" };
var foo = Substitute.For<ICollection<string>>();
foo.GetEnumerator().Returns((ci) => { return bar.GetEnumerator(); });