使用泛型时,模拟DbSet确实返回值

时间:2014-10-03 14:59:10

标签: c# entity-framework unit-testing generics moq

这是this question

的延续

我正在使用多个DbSets模拟DbContext。我将对象添加到模拟对象,但是当我尝试通过其id查询特定对象时,它会抛出错误。

AmazonReport.Tests.ProductTests.ProductControllerTest.TestReturnEditedModel:
    System.InvalidOperationException : Sequence contains no matching element

我已经将问题缩小到这个函数(foreach循环用来验证传入的id是否在DbSet中,它就是这样)

public virtual TEntity Get(TId id)
    {
        foreach(TEntity b in this.DbSet)
        {
            Console.WriteLine(b.Id + " and  " + id);
        }
        return this.DbSet.Single(x => (object)x.Id == (object)id);
        //return this.DbSet.Single(x => Convert.ToInt32(x.Id) == Convert.ToInt32(id));
        //return this.DbSet.SingleOrDefault(x => (object)x.Id == (object)id);
    }

原样,它不起作用。但是,如果我注释掉当前的return语句并使用return this.DbSet.Single(x => Convert.ToInt32(x.Id) == Convert.ToInt32(id));,它将不会抛出错误。

所以我的问题是,当DbSet包含id == 3的对象并传入TId id == 3时,为什么比较不返回任何对象?

1 个答案:

答案 0 :(得分:3)

因为通过强制转换为object,现在使用引用相等而不是值相等。这是一个真正简化的例子:

int i = 1;
int j = 1;

bool eq = ((object)i) == ((object)j); // false

直接比较两个整数与==比较两个值的值。