Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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# 使用FirstOrDefaultAsync()进行Nunit测试_C#_Unit Testing_Mocking_Async Await - Fatal编程技术网

C# 使用FirstOrDefaultAsync()进行Nunit测试

C# 使用FirstOrDefaultAsync()进行Nunit测试,c#,unit-testing,mocking,async-await,C#,Unit Testing,Mocking,Async Await,我有以下方法: public async Task<string> GetDescription(int codeId) { var Codes = Context.Codes.Where(x => x.Id == codeId).FirstOrDefault(); return Codes.Description; } 我的测试设置如下: public ServicesTests() {

我有以下方法:

public async Task<string> GetDescription(int codeId)
    {
        var Codes = Context.Codes.Where(x => x.Id == codeId).FirstOrDefault();
        return Codes.Description;
    }
我的测试设置如下:

public ServicesTests()
        {
            _dbContext = new Mock<LocalContext>();

            var CodeList = new List<Codes>() { new Codes() { Id = 1, Description = "description" } };
            var dbSetCodeList = MockDbSet.GetQueryableMockDbSet(CodeList);
            _dbContext.Setup(x => x.Codes).Returns(dbSetCodeList.Object);

            _context = new DataContext<LocalContext, LocalContext>(_dbContext.Object);
            _serivce = new CodesServices(_context);
        }

public static Mock<DbSet<T>> GetQueryableMockDbSet<T>(List<T> sourceList) where T : class
        {
            var queryable = sourceList.AsQueryable();

            var dbSet = new Mock<DbSet<T>>();
            dbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider);
            dbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryable.Expression);
            dbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
            dbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(() => queryable.GetEnumerator());
            dbSet.Setup(d => d.Add(It.IsAny<T>())).Callback<T>((s) => sourceList.Add(s));

            return dbSet;
        }
公共服务测试()
{
_dbContext=newmock();
var code List=new List(){new code(){Id=1,Description=“Description”};
var dbSetCodeList=MockDbSet.GetQueryableMockDbSet(代码列表);
_Setup(x=>x.code).Returns(dbSetCodeList.Object);
_context=newdatacontext(_dbContext.Object);
_serivce=新代码服务(上下文);
}
公共静态模拟GetQueryableMockDbSet(List sourceList),其中T:class
{
var queryable=sourceList.AsQueryable();
var dbSet=new Mock();
dbSet.As().Setup(m=>m.Provider).Returns(queryable.Provider);
设置(m=>m.Expression).Returns(queryable.Expression);
设置(m=>m.ElementType).Returns(queryable.ElementType);
dbSet.As().Setup(m=>m.GetEnumerator())。返回(()=>queryable.GetEnumerator());
dbSet.Setup(d=>d.Add(It.IsAny()).Callback((s)=>sourceList.Add));
返回dbSet;
}
这一切都很好

现在,我想等待函数,请执行以下操作:

public async Task<string> GetDescription(int codeId)
    {
        var Codes = await Context.Codes.Where(x => x.Id == codeId).FirstOrDefaultAsync();
        return Codes.Description;
    }
public异步任务GetDescription(int-codeId)
{
var code=wait Context.code.Where(x=>x.Id==codeId.FirstOrDefaultAsync();
返回代码。说明;
}
但这破坏了我的单元测试——即使代码仍然有效

我读过很多文章和帖子,解释这不起作用,因为异步方法不能被模仿(我想是吧?),但我没有遇到任何东西告诉我如何解决这个问题


如果我被迫在等待代码或进行单元测试之间做出选择,并确信一定有办法解决这一问题,我会感到失望。

我对结果不满意,但这是迄今为止我能做的最好的选择:

public async Task<string> GetDescription(int codeId)
    {
        var Codes = await GetAll();
        return Codes.Description;
    }

        private async Task<DbSet<Codes>> GetAll()
        {
            return Context.Codes;
        }
public异步任务GetDescription(int-codeId)
{
var代码=等待GetAll();
返回代码。说明;
}
私有异步任务GetAll()
{
返回上下文代码;
}

如果有人有更好的建议,请让我知道。

“打破你的测试”具体如何?实际失败的是什么?测试失败是因为在调用firstordefault()的行上没有返回任何内容。该代码本身没有问题(在
GetDescription()
中),NUnit(更新的版本)支持异步测试,没有问题。如果没有返回任何数据,则调用的代码没有返回任何数据。@sellotape能否告知NUnit的哪个版本支持此功能。我目前使用的是3.6,根据Nuget的说法,它似乎是最新版本,但它不支持这种异步方法;该版本绝对支持它。它不会编译,因为GetAll()会(有效地)返回一个集合。@sellotape它会编译并返回预期值。您100%确定吗?您将该方法标记为
async
,但不在其中使用
wait
,因此编译器至少应该对此表示不满(但可以允许)
Context.code
类型为
DbSet
,但方法返回类型实际上是
**Task**@sellotape您应该试一试-您确实会收到一条警告,说明该方法不包含wait函数,但它确实编译、运行并返回预期结果。据我所知,wait函数不是强制性的。似乎
async
修饰符正在导致编译器将
DbSet
自动转换为
Task
-这一部分现在是有意义的,尽管我以前没有看到过,因为我将所有警告设置为错误,因此,没有任何
wait
s的修饰符将始终标记为错误。然而<代码>代码。我的说明根本无法编译。您使用的是什么EF版本?
public async Task<string> GetDescription(int codeId)
    {
        var Codes = await GetAll();
        return Codes.Description;
    }

        private async Task<DbSet<Codes>> GetAll()
        {
            return Context.Codes;
        }