天道酬勤,学无止境

如何对自定义 JsonConverter 进行单元测试(How to unit test a custom JsonConverter)

问题

我有一个 json 有效负载,我想以一种重要的方式反序列化。

{
   "destinationId": 123
}

目标类是

public class SomeObject
{
    public Destination Destination { get; set; }
}

public class Destination
{
    public Destination(int destinationId)
    {
        Id = destinationId;
    }

    public int Id { get; set; }
}

为了能够做到这一点,我创建了一个JsonConverter来处理它。

这是 ReadJson 方法:

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    if (CanConvert(objectType))
    {
        var value = reader.Value;

        if (value is long v)
        {
            // TODO: this might overflow
            return new Destination((int)v);
        }
    }

    return null;
}

然后,我使用接受typeof(DestinationConverter)[JsonConverter]属性装饰了 Destination 类。

当我使用JsonConvert.DeserializeObject<SomeObject>(myString) (请参阅下面的单元测试)时,这可以正常工作,但我在为JsonConverter创建成功的单元测试时遇到问题(请参阅下面的第二个测试)。

[Test, AutoData]
public void SomeObject_is_correctly_deserialized(SomeObject testObject)
{
    var json = $@"{{""destinationId"":{testObject.Destination.Id}}}";

    Console.WriteLine($"json: {json}");

    var obj = JsonConvert.DeserializeObject<SomeObject>(json);

    Assert.That(obj.Destination.Id, Is.EqualTo(testObject.Destination.Id));
}

[Test, AutoData]
public void ReadJson_can_deserialize_an_integer_as_Destination(DestinationConverter sut, int testValue)
{
    JsonReader reader = new JTokenReader(JToken.Parse($"{testValue}"));

    var obj = sut.ReadJson(reader, typeof(Destination), null, JsonSerializer.CreateDefault());

    var result = obj as Destination;

    Assert.That(result, Is.Not.Null);
    Assert.That(result, Is.InstanceOf<Destination>());
    Assert.That(result.Id, Is.EqualTo(testValue));
}

我一直在寻找一种方法来正确地对转换后的对象进行单元测试,但我只找到了使用整个DeserializeObject而不仅仅是测试转换器的示例。

PS:我在 .NET Fiddle 中粘贴了所有必要的代码:https://dotnetfiddle.net/oUXi6k

回答1

您的基本问题是,当您创建JsonReader ,它最初位于第一个令牌之前。 JsonToken 的文档中提到了这一点:

JsonToken 枚举

指定 JSON 令牌的类型。

成员

  • None0如果尚未调用读取方法,则由 JsonReader 返回。

因此,要正确地对您的转换器进行单元测试,您需要将阅读器推进到您尝试阅读的 c# 对象的第一个标记,例如:

JsonReader reader = new JsonTextReader(new StringReader(json));
while (reader.TokenType == JsonToken.None)
    if (!reader.Read())
        break;

var obj = sut.ReadJson(reader, typeof(Destination), null, JsonSerializer.CreateDefault());

样品小提琴在这里。

完成后,我建议您按如下方式重写转换器:

public class DestinationConverter : JsonConverter
{
    public override bool CanConvert(System.Type objectType)
    {
        return objectType == typeof(Destination);
    }

    public override object ReadJson(Newtonsoft.Json.JsonReader reader, System.Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
    {
        var id = serializer.Deserialize<int?>(reader);
        if (id == null)
            return null;
        return new Destination(id.Value);
    }

    public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
    {
        // WriteJson() is never called with a null value, instead Json.NET writes null automatically.
        writer.WriteValue(((Destination)value).Id);
    }
}

通过在ReadJson()调用serializer.Deserialize<int?>(reader) ReadJson() ,您可以保证:

  • 在读取期间处理null值。

  • 如果 JSON 格式不正确(例如截断的文件),将引发异常。

  • 如果 JSON 无效(例如,预期为整数的对象,或整数溢出),将引发异常。

  • 阅读器将正确定位在正在阅读的令牌的末端。 (在令牌是原语的情况下,阅读器不需要高级,但对于更复杂的令牌,它确实如此。)

样品小提琴#2在这里。

您可能还想增强单元测试以检查:

  1. 阅读器在ReadJson()之后被正确定位,例如通过断言 TokenType 和 Depth 是正确的,或者甚至计算 JSON 流中剩余的令牌数量并断言它符合预期。

    编写转换器时的一个常见错误是在转换后让阅读器定位错误。 完成后,对象本身被成功读取,但所有后续对象都损坏了。 除非您断言阅读器之后正确定位,否则直接对ReadJson()单元测试将无法捕捉到这一点。

  2. 对于格式不正确的 JSON 流,例如被截断的 JSON 流,将引发异常。

  3. 意外的 JSON 令牌会引发异常,例如,当在需要原语的地方遇到数组时。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何对自定义元素进行单元测试(How can I unit test a custom element)
    问题 我有一个扩展HTMLElement的类。 从阅读这个线程 https://github.com/Microsoft/TypeScript/issues/574#issuecomment-231683089 我看到我无法在没有获得Illegal constructor实例化自定义元素。 此外, registerElement看起来很有希望,因为它返回了自定义元素的构造函数,但现在不推荐使用CustomElementRegistry.define() 1. 存在于窗口对象上,2. 返回 void。 任何解决方案将不胜感激,谢谢。 对于此特定设置,我尝试使用本机自定义元素而不是 Web 组件框架,因为我只需要自定义元素。 另外,我正在使用 TypeScript 并尝试使用 Jest 来测试它。 回答1 根据您的元素究竟在做什么,您可以考虑考虑“关注分离”和“控制反转”的设计原则。 当不同的东西在不同的类中实现时,就可以实现关注点分离。 这也意味着可以在不实例化具体 HtmlElement 的情况下测试分离的事物。 此时控制反转就派上用场了,因为如果分离的类(可能是 HtmlElement)的依赖项可以从类的外部设置,您可以通过为测试实例提供一个存根来轻松存根或模拟 HtmlElement。 这个想法是以一种独立于单元测试中不可访问或不可控制的事物的方式来设计您的代码。
  • 如何使用 Moq 对自定义 ModelBinder 进行单元测试?(How to Unit Test a custom ModelBinder using Moq?)
    问题 我在编写一些单元测试来测试我创建的自定义 ModelBinder 时遇到了一些困难。 我要进行单元测试的 ModelBinder 是我在此处发布的 JsonDictionaryModelBinder。 我遇到的问题是使用 Moq 进行 Mocking all 设置。 由于 HttpContextBase 没有被正确模拟,我不断收到空异常。 我认为。 有人可以帮我弄清楚我没有做正确的事情吗? 这是我正在尝试编写但不起作用的单元测试示例: [TestMethod()] public void BindModelTest() { JsonDictionaryModelBinder target = new JsonDictionaryModelBinder(); NameValueCollection nameValueCollection = new NameValueCollection() { {"First", "1"}, {"Second", "2"}, {"Name", "Chris"}, {"jsonValues", "{id: 200, name: 'Chris'}"} }; HttpContextBase httpContext = MockHelper.FakeHttpContext(HttpVerbs.Post, nameValueCollection)
  • Angular2 如何对自定义验证器指令进行单元测试?(Angular2 how to unit test a custom validator directive?)
    问题 我为输入字段编写了一个非常简单的自定义验证器: import { Directive } from '@angular/core'; import { AbstractControl, NG_VALIDATORS } from '@angular/forms'; function numberValidator(c: AbstractControl) { if (!c.value) return null; return new RegExp('^[1-9][0-9]{6,9}$').test(c.value) ? null : { validateNumber: { valid: false } } } @Directive({ selector: '[number-validator]', providers: [ { provide: NG_VALIDATORS, multi: true, useValue: numberValidator } ] }) export class NumberValidator { } 我想对这个验证器进行单元测试。 我在 Angular2 页面上阅读了测试属性指令,但没有更改的 css 或 html。 如何对这个验证器进行单元测试? 回答1 如果你想用简单的方法(我会这样做,因为所有的逻辑都在验证器函数中),只是测试验证器函数。
  • Python:如何对自定义 HTTP 请求处理程序进行单元测试?(Python: How to unit test a custom HTTP request Handler?)
    问题 我有一个自定义的 HTTP 请求处理程序,可以简化为这样的: # Python 3: from http import server class MyHandler(server.BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header("Content-type", "text/html") self.end_headers() # Here's where all the complicated logic is done to generate HTML. # For clarity here, replace with a simple stand-in: html = "<html><p>hello world</p></html>" self.wfile.write(html.encode()) 我想对这个处理程序进行单元测试(即确保我的do_GET没有异常地执行)而不实际启动 Web 服务器。 是否有任何轻量级方法来模拟SimpleHTTPServer以便我可以测试此代码? 回答1 这是我想出的一种模拟服务器的方法。 请注意,这应该与 Python 2 和 Python 3 兼容。唯一的问题是我找不到访问GET请求结果的方法
  • 在ASP.NET MVC 2中对自定义模型绑定程序进行单元测试(Unit testing custom model binder in ASP.NET MVC 2)
    问题 我已经在使用ASP.NET MVC 2的项目中编写了自定义模型绑定程序。此模型绑定程序仅绑定模型的2个字段: public class TaskFormBinder : DefaultModelBinder { protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) { if (propertyDescriptor.Name == "Type") { var value = bindingContext.ValueProvider.GetValue("Type"); var typeId = value.ConvertTo(typeof(int)); TaskType foundedType; using (var nhSession = Domain.GetSession()) { foundedType = nhSession.Get<TaskType>(typeId); } if (foundedType != null) { SetProperty(controllerContext, bindingContext
  • 使用 Maven 构建单独的 JAR 文件以对自定义类加载器进行单元测试(Using Maven to build separate JAR files for unit testing a custom class loader)
    问题 作为我当前项目的一部分,我创建了一个自定义类加载器。 自定义加载器的部分单元测试涉及使用一些 JAR 文件来演示加载器的正确行为。 我想在运行实际单元测试之前从 Java 源构建测试 JAR 文件。 此外,运行单元测试时,测试 JAR 文件不能位于类路径上,因为我想在测试执行期间动态加载它们。 是否有标准模式可以完成这种“在测试阶段之前在侧面构建一些 JAR 但将它们排除在类路径之外”的要求? 我不敢相信我是第一个尝试使用 Maven 2 执行此操作的人,但我似乎无法找到正确的 POM 结构和依赖项。 通常我最终会在测试阶段之前没有构建一些测试 jar,但是我也遇到了不一致的构建顺序问题,导致构建在一台机器上正常工作,但无法构建一些在另一个上测试罐子。 回答1 最简单的做法是设置另一个项目来打包测试 jar 的类,然后将其设置为正常的测试范围依赖项。 如果您不想/不能这样做,您可以使用程序集插件在process-test-classes阶段(即在编译测试之后但在执行测试之前)创建一个 jar。 下面的配置将调用程序集插件在目标目录中的那个阶段创建一个名为classloader-test-deps的 jar。 然后,您的测试可以根据需要使用该 jar。 程序集插件使用程序集描述符(在 src/main/assembly 中,称为 test-assembly.xml)来打包目标
  • 如何使用 ModelMetadata 对模型绑定器进行单元测试(How to unit test modelbinder with ModelMetadata)
    问题 如何对自定义 ModelBinder 进行单元测试? 这是代码。 public class MagicBinder : DefaultModelBinder { public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var boundModelObject = base.BindModel(controllerContext, bindingContext); var properties = bindingContext.ModelType.GetProperties().Where(a => a.CanWrite); foreach (var propertyInfo in properties) { object outValue = null; bindingContext.TryGetValue(propertyInfo.Name, propertyInfo.DeclaringType, out outValue); propertyInfo.SetValue(boundModelObject, outValue, null); } return boundModelObject; } } 这是测试脚本。
  • Android:如何测试自定义视图?(Android: How to test a custom view?)
    问题 Android 中有多种单元测试方法,测试我编写的自定义视图的最佳方法是什么? 我目前正在将它作为我在仪器测试用例中的活动的一部分进行测试,但我宁愿只测试视图,隔离。 回答1 缺少以视图为中心的 TestCase 实现的一个简单解决方案是在包含您的视图的测试项目中创建一个简单的 Activity。 这将允许您使用简单的活动针对视图编写测试。 活动测试的相关资料: http://developer.android.com/reference/android/test/ActivityUnitTestCase.html 回答2 Well 单元测试是一种测试源代码的各个单元以确定它们是否适合使用的方法。 因此,当您说要测试自定义视图时,可以检查自定义视图的各种方法,例如“onTouchEvent”、“onDown”、“onFling”、“onLongPress”、“onScroll”、“onShowPress”、“onSingleTapUp”、 “onDraw”和其他各种取决于您的业务逻辑。 您可以提供模拟值并对其进行测试。 我建议使用两种方法来测试您的自定义视图。 1) Monkey 测试Monkey 测试是由自动化测试工具执行的随机测试。 猴子测试是一种单元测试,它在运行时没有考虑特定的测试。 在这种情况下,猴子是任何输入的生产者。 例如
  • 工作流单元测试(WorkFlow Unit Testing)
    问题 如何对 Windows 工作流程进行单元测试? 回答1 K. Scott Allen 发布了这篇文章,它提供了一种对自定义活动进行单元测试的方法(尽管他说他并不满意)。 Ron Jacobs 在这里和这里提出了类似的方法。 Maurice 在这里和这里提出了另一种方法(他使用了 Will 已经提到的 TypeMock)。 回答2 Microsoft.Activity.UnitTesting。 一个帮助类和活动的库,旨在使工作流的单元测试更容易。 看起来下载页面上也有第 9 频道的视频。 回答3 MS 放弃了使工作流程易于模拟和测试的问题。 如果你想对你的自定义活动进行彻底的测试,你需要购买一个可以模拟密封类型的模拟框架,比如 TypeMock。 否则,您将不得不围绕 Workflow 的限制编写代码。
  • React Hook测试指南
    在React为什么需要Hook中我们探讨了React为什么需要引入Hook这个属性,在React Hook实战指南中我们深入了解了各种Hook的详细用法以及会遇到的问题,在本篇文章中我将带大家了解一下如何通过为自定义hook编写单元测试来提高我们的代码质量,它会包含下面的内容: 什么是单元测试 单元测试的定义为什么需要编写单元测试单元测试需要注意什么 如何对自定义Hook进行单元测试 JestReact-hooks-testing-library例子 什么是单元测试 单元测试的定义 要理解单元测试,我们先来给测试下个定义。用最简单的话来说测试就是:我们给被测试对象一些输入(input),然后看看这个对象的输出结果(output)是不是符合我们的预期(match with expected result)。而在软件工程里面有很多不同类型的测试,例如单元测试(unit test),功能测试(functional test),性能测试(performance test)和集成测试(integration test)等。不同种类的测试的主要区别是被测试的对象和评判指标不一样。对于单元测试,被测试的对象是我们源代码的独立单元(individual unit),在面向过程编程语言(procedural programming)里面,单元就是我们封装的方法(function)
  • 手把手从零开始小程序单元测试(附避坑指南以及源码跟踪)
    单元测试是一个老生常谈的话题,基于Web/NodeJs环境的测试框架、测试教程数不胜数,也趋于成熟了。但是对于微信小程序的单元测试,目前还是处于起步状态,这两天在研究微信小程序的测试,也遇到了一些坑,在这里记录一下,希望给看到本文的小伙伴带来一点帮助,少走一些弯路。 本文内容有点多,但是干货满满,不明白的小伙伴可以关注公众号给我留言 demo地址https://github.com/xialeistudio/miniprogram-unit-test-demo 关键依赖版本本文写作时相关依赖版本如下(版本不同,源码行数可能不同): miniprogram-simulate: 1.0.7 j-component: 1.1.6 miniprogram-exparser: 0.0.6 测试流程 初始化小程序项目,编写待测试组件 安装jest,miniprogram-simulate测试环境 编写测试用例 执行测试 初始化小程序项目 使用小程序开发者工具初始化新项目,APPID选择测试号即可,语言选择Javascript。 使用小程序开发者工具新建/components/user组件 components/user.js // components/user.js Component({ data: { nickname: '' }, methods: { handleUserInfo
  • 如何在 Swift 中对这个自定义 UITextField 进行单元测试?(How to unit-test this custom UITextField in Swift?)
    问题 我创建了一个像这样的自定义 UITextField import Foundation import UIKit class NoZeroTextField: UITextField, UITextFieldDelegate { required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.delegate = self } func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { if (string == "0" ) { //ignore input return false } return true } } 我正在尝试为该类编写单元测试,但问题在于将 NSCoder 实例传递给构造函数。 我无法实例化它或将其设置为 nil。 我如何对这个类进行单元测试? 回答1 我想通了。 被测类: import Foundation import UIKit public class CustomTextField: UITextField, UITextFieldDelegate{ required
  • Django 中的 TDD,如何对我的模型表单进行单元测试?(TDD in Django, how to unit test my modelform?)
    问题 我是 TDD 的新手,并尝试在 Django 项目中应用 TDD 实践。 基于伦敦学校 TDD 工作流程,我正在从外到内、视图层、表单层和模型层工作。 在表单层,我计划构建一个具有一些自定义验证方法的模型表单。 我认为,基于 TDD,我只需要测试我的自定义方法,无需触及: Django 提供的整个 ModelForm 逻辑,这是一个经过良好测试的依赖项。 下层模型层,目前尚不存在。 但是我该怎么做呢? 例如,使用以下模型形式: from django import forms from app import models class MyModelForm(forms.ModelForm): class Meta: model = models.MyModel fields = ("field1", "field2") def clean_field1(self): # custom cleaning logic def clean_field2(self): # custom cleaning logic def clean(self): # custom cleaning logic 我如何(或应该)模拟MyModel ? 我想出了@patch("app.forms.MyModelForm._meta.model") class FormTest(TestCase): #
  • 如何进行单元测试以查看角度是否未定义?(How can I do a unit test to see if angular is undefined?)
    问题 我在茉莉花色版本1中使用茉莉花进行单元测试。 我想做的测试是: 例如,当我在ie7中加载index.html页面时,我会在html标语中加载说要下载最新的浏览器。 我目前在索引页面上使用JQuery加载html模板。 由于它在角度应用程序之外,是否有可能对其进行测试。 这是我在index.html页面上的当前代码: <!doctype html> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script> <base href="/app/" /> <!-- Is Angular supported --> <script> if(window.angular === undefined) $(function(){$("#angularNotSupportedModal").load("/app/noAngularModal.html");}); </script> </head> <body ng-app="app" ng-cloak> <div id="angularNotSupportedModal"></div> <div ui-view></div> <!-- Application --> <script src="
  • 如何对自定义 Keras / Tensorflow 损失函数中的值进行排序?(How can I sort the values in a custom Keras / Tensorflow Loss Function?)
    问题 介绍 我想为 Keras 实现一个自定义损失函数。 我想这样做,因为我对我的数据集的当前结果不满意。 我认为这是因为目前内置的损失函数专注于整个数据集。 我只想关注数据集中的最高值。 这就是为什么我想出了以下自定义损失函数的想法: 自定义损失函数理念 自定义损失函数应该取前 4 个预测值最高的预测值,并用相应的真实值减去它。 然后从这个减法中取出绝对值,将其乘以一些权重并将其添加到总损失总和中。 为了更好地理解这个自定义损失函数,我使用列表输入对其进行了编程。 希望通过这个例子可以更好地理解: 以下示例计算损失 = 4*abs(0.7-0.5)+3*abs(0.5-0.7)+2*abs(0.4-0.45) +1*abs(0.4-0.3) = 1.6 for i=0 然后将它除以 div_top,在本例中为 10(对于 i=0,它将为 0.16),对所有其他 i 重复所有操作,最后取所有样本的平均值。 top = 4 div_top = 0.5*top*(top+1) def own_loss(y_true, y_pred): loss_per_sample = [0]*len(y_pred) for i in range(len(y_pred)): sorted_pred, sorted_true = (list(t) for t in zip(*sorted(zip(y
  • 如何在RequireJS中模拟依赖关系以进行单元测试?(How can I mock dependencies for unit testing in RequireJS?)
    问题 我有一个要测试的AMD模块,但我想模拟其依赖关系,而不是加载实际的依赖关系。 我正在使用requirejs,模块的代码如下所示: define(['hurp', 'durp'], function(Hurp, Durp) { return { foo: function () { console.log(Hurp.beans) }, bar: function () { console.log(Durp.beans) } } } 我该如何模拟hurp和durp以便有效地进行单元测试? 回答1 因此,在阅读了这篇文章之后,我想出了一个使用requirejs config函数为您的测试创建新上下文的解决方案,您可以在其中轻松模拟依赖项: var cnt = 0; function createContext(stubs) { cnt++; var map = {}; var i18n = stubs.i18n; stubs.i18n = { load: sinon.spy(function(name, req, onLoad) { onLoad(i18n); }) }; _.each(stubs, function(value, key) { var stubName = 'stub' + key + cnt; map[key] = stubName; define
  • 如何在 C# 中的单元测试中映射路径(How to MapPath in a unit test in C#)
    问题 我想在单元测试中加载一个外部 XML 文件来测试该 XML 上的一些处理代码。 我如何获取文件的路径? 通常在网络应用程序中我会这样做: XDocument.Load(Server.MapPath("/myFile.xml")); 但显然在我的单元测试中我没有引用 Server 或 HttpContext 那么我如何映射路径以便我不必指定完整路径? 更新: 我只想说明我实际测试的代码是针对 XML 解析器类的,例如: public static class CustomerXmlParser { public static Customer ParseXml(XDocument xdoc) { //... } } 所以为了测试这个,我需要解析一个有效的 XDocument。 被测试的方法不访问文件系统本身。 我可以直接在测试代码中从字符串创建 XDocument,但我认为从文件加载它会更容易。 回答1 另一个想法是利用依赖注入。 public interface IPathMapper { string MapPath(string relativePath); } 然后简单地使用2个实现 public class ServerPathMapper : IPathMapper { public string MapPath(string relativePath){
  • 查找和捕获解析错误的 ANTLR 最佳实践(ANTLR best practice for finding and catching parse errors)
    问题 此问题涉及如何从 Visual Studio 中的 C# 中的 ANTLR4 解析器中获取错误消息。 我向 ANTLR 解析器提供了一个已知的错误输入字符串,但在(错误)解析过程中我没有看到任何错误或解析异常。 因此,我的异常处理程序在解析过程中没有机会创建和存储任何错误消息。 我正在使用我知道正确的 ANTLR4 语法,因为我可以看到图形形式的正确解析操作输出,并带有 Visual Studio Code 的 ANTLR 扩展。 我知道生成的解析器代码是正确的,因为我可以正确编译它而不会出错,覆盖基本访问者类,并使用我覆盖的 VisitXXX 方法从解析树中打印出各种信息。 在这一点上,我正在运行一个非常简单的测试用例,它输入一个错误的输入字符串,并在我存储的解析错误列表中查找非零计数。 我对错误处理代码充满信心,因为它在另一种语法的类似情况下工作。 但是错误处理代码必须捕获解析异常才能生成错误消息。 (也许这不是捕获/检测解析错误的正确方法,例如输入流中的意外标记或其他错误。) 这是我用来替换默认词法分析器和解析器错误侦听器的代码。 // install the custom ErrorListener into the parser object sendLexer.RemoveErrorListeners(); sendLexer.AddErrorListener
  • 如何对需要用户在 Bot Framework 中选择一个选项的自定义提示进行单元测试(How to unit test custom prompt that requires user select a choice in Bot Framework)
    问题 我有一些使用自适应卡片制作的自定义提示,需要用户输入,例如 input.ChoiceSet 和 input.Text。 我的问题是,如果我有一张有 3 个选项(“红色”、“蓝色”、“绿色”)的卡片,我想测试选择“红色”的结果。 如何在我的测试代码中发送选择并获得结果。 我想在选择某些内容并且用户点击提交按钮后对结果和流程进行单元测试。 我使用 JObject 将用户的选择作为字符串获取; 在我的对话框类的构造函数中,我已将提示添加到对话框中。 AddDialog(new CustomPrompt("cardPrompt", DialogValidators.AdaptiveCardValidatorAsync)); 这是我用于测试的对话框代码。 private async Task<DialogTurnResult> aStep(WaterfallStepContext stepContext, CancellationToken cancellationToken) { var adaptiveActivity = stepContext.Context.Activity.CreateReply(); adaptiveActivity.AddCardAttachment(); return await stepContext.PromptAsync( "CardPrompt
  • 如何对调用 getJSON 的 javascript 函数进行单元测试(How to unit test javascript function that calls getJSON)
    问题 我已经为单元测试苦苦挣扎了 2 天,关于异步测试,我无法实现一些目标。 我是单元测试的新手,我不明白为什么这不起作用。 我有一个文件 login.js 调用 $.getJSON(url, data, function) 并返回一个带有登录状态(“成功”或“失败”)的字符串。 对 $.getJSON 的调用使用 mockjax 来获取数据(它包装了一个 ajax 调用)。 当使用 jQuery click 事件从测试网页调用时,登录功能可以正常工作。 但现在我正在尝试使用 Qunit 和 PhantomJS 运行无头测试。 似乎问题在于测试没有等待 $.getJSON 调用来获取结果(即使使用超时)。 有什么线索吗? 这是代码。 登录.js var login = function(user, pass){ $.getJSON("loginURL", {"user":user, "pass":pass}, function(response){ if(response.status === "success"){ //do something return "success"; } else{ //do something else return "fail"; } }); }; 测试.js test("Test login", function(){ var user =