我在尝试针对asp.net核心管道的组件调试xUnit时看到奇怪的行为。下面发布的代码删除了所有有目的的功能,仅用于说明问题:
JsonModelBinder的生产代码包含更多逻辑来反序列化输入的字符串数据。此代码包含失败逻辑,其中包含许多返回Task.Completed语句。使用此代码时,调试器将评估这些return语句,但会继续执行,直到返回到方法的末尾,一直到末尾才返回。
我正在使用Moq,xUnit,VS2017,ASP.net Core 2.2。
//简单事实
[Fact]
public async Task BindModelAsync_WithNullValueProvider_SetsDefaultError()
{
// arrange
var queryStringCollection = new RouteValueDictionary
{
{"Page", "1"},
{"Size", "20"}
};
var valueProvider = new RouteValueProvider(BindingSource.Path, queryStringCollection);
ModelBindingContext bindingContext = new DefaultModelBindingContext
{
ModelName = "Test",
ValueProvider = valueProvider
};
var jsonBinder = new JsonModelBinder();
// act
await jsonBinder.BindModelAsync(bindingContext);
// not point in asserting :-)
}
// JsonModelBinder
public class JsonModelBinder : IModelBinder
{
private readonly IOptions<MvcJsonOptions> _jsonOptions;
private readonly ILoggerFactory _loggerFactory;
public JsonModelBinder() { }
public Task BindModelAsync(ModelBindingContext bindCtx)
{
string modelName = bindCtx.ModelName;
Debug.Print(modelName);
if (string.IsNullOrEmpty(modelName))
{
return Task.CompletedTask;
}
return Task.CompletedTask;
}
}
** 编辑项目参考
答案 0 :(得分:1)
我的一位同事遇到了同样的问题。 经过大量调试和调查,我们发现这为他解决了问题。
最后一步似乎很重要。