在实体中模拟ICollection属性 - c#

我正在对实体执行一些单元测试,并且在模拟属性时有一些心理障碍。采取以下实体:

public class Teacher
{
    public int MaxBobs { get; set; }
    public virtual ICollection<Student> Students { get; set; }
}

public class Student
{
    public string Name { get; set; }
    public virtual Teacher Teacher { get; set; }
}

我在Teacher上有一个称为AddStudent的方法,该方法首先检查老师是否分配了过多的学生,称为Bob。如果是这样,那么我会提出一个自定义例外,说有太多鲍勃。该方法如下所示:

public void AddStudent(Student student)
{
    if (student.Name.Equals("Bob"))
    {
        if (this.Students.Count(s => s.Name.Equals("Bob")) >= this.MaxBobs)
        {
            throw new TooManyBobsException("Too many Bobs!!");
        }
    }

    this.Students.Add(student);
}

我想使用Moq模拟进行单元测试-特别是我想模拟.CountTeacher.Students方法,在这里我可以传递任何表达式,并且它将返回一个数字,表明当前有10个Bob分配给该老师。我正在这样设置:

[TestMethod]
[ExpectedException(typeof(TooManyBobsException))]
public void Can_not_add_too_many_bobs()
{
    Mock<ICollection<Student>> students = new Mock<ICollection<Student>>();
    students.Setup(s => s.Count(It.IsAny<Func<Student, bool>>()).Returns(10);

    Teacher teacher = new Teacher();
    teacher.MaxBobs = 1;

    // set the collection to the Mock - I think this is where I'm going wrong
    teacher.Students = students.Object; 

    // the next line should raise an exception because there can be only one
    // Bob, yet my mocked collection says there are 10
    teacher.AddStudent(new Student() { Name = "Bob" });
}

我期待我的自定义异常,但是我实际上得到的是System.NotSupportedException,它推断.CountICollection方法不是虚拟的,因此无法被模拟。如何模拟这个特定功能?

任何帮助总是感激不尽!

参考方案

您不能模拟正在使用的Count方法,因为它是扩展方法。这不是在ICollection<T>上定义的方法。
最简单的解决方案是将一个包含10个鲍勃的列表分配给Students属性:

teacher.Students = Enumerable.Repeat(new Student { Name = "Bob" }, 10)
                             .ToList();

与哪些运算符>>兼容 - java

我这里没有什么代码int b=3; b=b >> 1; System.out.println(b); 它可以完美工作,但是当我将变量b更改为byte,short,float,double时,它包含错误,但是对于变量int和long来说,它可以完美工作,为什么它不能与其他变量一起工作? 参考方案 位移位运算符(例如>>)与任何整数类型兼…

>> Python中的运算符 - python

>>运算符做什么?例如,以下操作10 >> 1 = 5有什么作用? 参考方案 它是右移运算符,将所有位“右移”一次。二进制10是1010移到右边变成0101这是5

Python 3运算符>>打印到文件 - python

我有以下Python代码编写项目的依赖文件。它可以在Python 2.x上正常工作,但是在使用Python 3进行测试时会报告错误。depend = None if not nmake: depend = open(".depend", "a") dependmak = open(".depend.mak&#…

剃刀付款集成->如何通过关闭按钮X检测剃刀付款模型是否关闭 - javascript

当用户关闭而无需付款时,我在CI框架中使用Razorpay,请创建razor支付模型,然后取消订单,我希望按状态更改为已取消的状态触发查询。所以我怎么能检测到这一点。我已经通过单击jQuery单击关闭功能但无法使用... javascript大神给出的解决方案 Razorpay提供了JS方法来检测模式关闭。您编写的任何JS代码都不会在结帐页面上运行,因为它是…

做什么->在python中做什么 - python

我今天看到了一个python示例,它使用了->例如,这就是我所看到的:spam = None bacon = 42 def monty_python(a:spam,b:bacon) -> "different:": pass 该代码在做什么?我不太确定我以前从未看过像这样的代码,但我真的没有得到什么 a:spam,b:baco…