Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何模拟SqlQuery_C#_Linq_Unit Testing - Fatal编程技术网

C# 如何模拟SqlQuery

C# 如何模拟SqlQuery,c#,linq,unit-testing,C#,Linq,Unit Testing,我对写测试和模拟是新手。我试图弄明白如何模拟原始SQL来检索数据。以下是我所拥有的: 我有DataContext.cs public class DataContext : DbContext { public DataContext() : base("Main") { } public virtual DbSet<DbBook> Books { get; set; } public virtual DbSet<D

我对写测试和模拟是新手。我试图弄明白如何模拟原始SQL来检索数据。以下是我所拥有的:

我有DataContext.cs

public class DataContext : DbContext
{
    public DataContext() 
         : base("Main")
    {
    }

    public virtual DbSet<DbBook> Books { get; set; }
    public virtual DbSet<DbMovie> Movies { get; set; }
}
我有一个测试

[TestMethod]
public void GetBook()
{
    var data = new List<DbBook>
    {
        new DbBook{ Book = "Book1"},
        new DbBook{ Book = "Book2"}
    }.AsQueryable();

    var mockSet = new Mock<DbSet<DbScriptId>>();
    mockSet.As<IQueryable<DbBook>>().Setup(m => 
    m.Provider).Returns(data.Provider);
    mockSet.As<IQueryable<DbBook>>().Setup(m => 
    m.Expression).Returns(data.Expression);
    mockSet.As<IQueryable<DbBook>>().Setup(m => 
    m.ElementType).Returns(data.ElementType);
    mockSet.As<IQueryable<DbBook>>().Setup(m => 
    m.GetEnumerator()).Returns(data.GetEnumerator());
    mockSet.Setup(m => m.Find(It.IsAny<object[]>()))
         .Returns<object[]>(sc => data.SingleOrDefault());


    var mockContext = new Mock<DataContext>();
    mockContext.Setup(c => c.Books).Returns(mockSet.Object);

    var controller = new BooksController (mockContext.Object);
    var books = controller.GetBook();
}
[TestMethod]
public-void-GetBook()
{
var数据=新列表
{
新DbBook{Book=“Book1”},
新DbBook{Book=“Book2”}
}.AsQueryable();
var mockSet=new Mock();
mockSet.As().Setup(m=>
m、 提供程序),返回(data.Provider);
mockSet.As().Setup(m=>
m、 返回(data.Expression);
mockSet.As().Setup(m=>
m、 返回(data.ElementType);
mockSet.As().Setup(m=>
m、 GetEnumerator())。返回(data.GetEnumerator());
mockSet.Setup(m=>m.Find(It.IsAny()))
.Returns(sc=>data.SingleOrDefault());
var mockContext=new Mock();
Setup(c=>c.Books).Returns(mockSet.Object);
var controller=newbookscontroller(mockContext.Object);
var books=controller.GetBook();
}
我可以使用Linq(test2)检索数据,但是使用SqlQuery我总是得到null(test)。如何使用SqlQuery改变这种情况,我会得到与使用Linq相同的结果?我还了解到,创建InMemory数据库实际上是在后台创建一些列表(type=iQuery),而不是数据库。你能为这个问题提供一些解释和解决方案吗

这个怎么样。(不确定我是否正确理解你的问题)

var queryMock=new Mock();
Setup(x=>x.GetEnumerator()).Returns(data.GetEnumerator());
Setup(m=>m.SqlQuery(It.IsAny(),It.IsAny()).Returns(queryMock.Object);
本例假设所有查询都将返回所有项目。

这怎么样。(不确定我是否正确理解你的问题)

var queryMock=new Mock();
Setup(x=>x.GetEnumerator()).Returns(data.GetEnumerator());
Setup(m=>m.SqlQuery(It.IsAny(),It.IsAny()).Returns(queryMock.Object);

本例假设所有查询都将返回所有项。

您在模拟什么?原始SQL带走了所有依赖项注入,让您无需模仿。你想测试什么?我应该编辑代码。我只是想测试我是否从GetBooks()方法中得到了一些结果。当我调试测试时,它跳转到GetBooks()方法中,然后“test”变量变为null,同时“test2”得到所需的数据。好的,如何测试原始SQL语句?你在嘲笑什么?原始SQL带走了所有依赖项注入,让您无需模仿。你想测试什么?我应该编辑代码。我只是想测试我是否从GetBooks()方法中得到了一些结果。当我调试测试时,它跳转到GetBooks()方法中,然后“test”变量变为null,同时“test2”得到所需的数据。好的,如何测试原始SQL语句?我已经试过了,看起来更好,“test”返回一个对象,但结果视图返回“枚举未产生结果”,而“test2”(Linq)通常会返回。但这是向前迈出的一步,我想我只是需要一些额外的知识来完成这件事。感谢您的尝试,看起来更好,“test”返回一个对象,但结果视图返回“枚举未产生结果”,而“test2”(Linq)通常会返回。但这是向前迈出的一步,我想我只是需要一些额外的知识来完成这件事。谢谢
[TestMethod]
public void GetBook()
{
    var data = new List<DbBook>
    {
        new DbBook{ Book = "Book1"},
        new DbBook{ Book = "Book2"}
    }.AsQueryable();

    var mockSet = new Mock<DbSet<DbScriptId>>();
    mockSet.As<IQueryable<DbBook>>().Setup(m => 
    m.Provider).Returns(data.Provider);
    mockSet.As<IQueryable<DbBook>>().Setup(m => 
    m.Expression).Returns(data.Expression);
    mockSet.As<IQueryable<DbBook>>().Setup(m => 
    m.ElementType).Returns(data.ElementType);
    mockSet.As<IQueryable<DbBook>>().Setup(m => 
    m.GetEnumerator()).Returns(data.GetEnumerator());
    mockSet.Setup(m => m.Find(It.IsAny<object[]>()))
         .Returns<object[]>(sc => data.SingleOrDefault());


    var mockContext = new Mock<DataContext>();
    mockContext.Setup(c => c.Books).Returns(mockSet.Object);

    var controller = new BooksController (mockContext.Object);
    var books = controller.GetBook();
}
 var queryMock = new Mock<DbSqlQuery<DbBook>>();
 queryMock.Setup(x => x.GetEnumerator()).Returns(data.GetEnumerator());

 mockSet.Setup(m => m.SqlQuery(It.IsAny<string>(), It.IsAny<object[]>())).Returns(queryMock.Object);