MAIBILAI

javascript - 试图理解 Jasmine 的 toHaveBeenCalled() 匹配器

coder 2024-05-09

我是 jasmine 的新手,这是我的 src 文件,我在其中创建了 Auth

function Auth() {
}

Auth.prototype.isEmpty = function(str) {
    return (!str || 0 === str.length);
}

Auth.prototype.Login = function (username , password) {
    if (this.isEmpty(username) || this.isEmpty(password)) {
        return "Username or Password cann't be blank ";
    }
    else {
        return "Logged In !";
    }
}

现在我想测试 jasmine 的 toHaveBeenCalled() 匹配器。这是我写的

it("should be able to Login", function () {
    spyOn(authobj);
    expect(authobj.Login('abc', 'abc')).toHaveBeenCalled();
});

但是它说 undefined() 方法不存在

最佳答案

查看您的用例,我不建议在此处使用 toHaveBeenCalledtoHaveBeenCalled 在您需要测试回调(异步)或结合模拟的情况下很有用。

Auth.prototype.Login 中发生的所有事情都视为对“外部世界”不可见的实现细节。您不应该测试实现细节。这引发了两个问题。

为什么我不应该测试实现细节?

这让重构变得困难。假设您出于某些原因想要用 underscore.isEmpty 替换 Auth.prototype.isEmpty。几天后,您决定将 underscore 完全替换为 lodash。这将迫使您更改测试三次。将所有阻碍您轻松重构的因素都视为“不行”。

我应该测试什么?

公共(public) API。 “外部世界”可见的一切。在您的情况下是“已登录!”和“用户名或密码不能为空”。

这导致 3 个测试:

describe('Login', function() {

 it('returns "success" string when username and password are not empty', function() {
   expect(new Auth().Login('non-empty', 'non-empty')).toBe('Logged In !');
 });

 it('returns "failure" string when username is empty', function() {
   expect(new Auth().Login('', 'non-empty')).toBe('Username or Password cannot be blank');
 });

 it('returns "failure" string when password is empty', function() {
   expect(new Auth().Login('non-empty', '')).toBe('Username or Password cannot be blank');
 });

});

关于javascript - 试图理解 Jasmine 的 toHaveBeenCalled() 匹配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16787351/

有关javascript - 试图理解 Jasmine 的 toHaveBeenCalled() 匹配器的更多相关文章

  1. c# - List.Any 得到匹配的字符串 - 2

    FilePrefixList.Any(s=>FileName.StartsWith(s))我可以在这里获取s值吗?我想显示匹配的字符串。 最佳答案 Any仅确定是否存在匹配项,除bool外不返回任何内容它需要执行查询。您可以使用Where或First/FirstOrDefault:stringfirstMastch=FilePrefixList.FirstOrDefault(s=>FileName.StartsWith(s));//nullifnomatchvarallMatches=FilePrefixList.Whe

  2. c# - WCF契约不匹配问题 - 2

    我有一个与WCF服务通信的客户端控制台应用程序,但出现以下错误:“服务器没有提供有意义的回复;这可能是由于契约(Contract)不匹配、session过早关闭或内部服务器错误造成的。”我认为这是因为契约(Contract)不匹配,但我不明白为什么。该服务本身运行良好,并且这两个部分一起工作,直到我添加了模拟代码。谁能看出哪里出了问题?这是客户端,全部用代码完成:NetTcpBindingbinding=newNetTcpBinding();binding.Security.Mode=SecurityMode.Message;binding.Security.Message.Clien

  3. c# - UnauthorizedAccessException 试图删除文件夹中的文件,我可以在其中删除具有相同代码的其他文件 - 2

    我遇到了未授权访问异常在我可以手动删除的文件中。在我可以通过代码删除其他文件的文件夹中并且文件没有被标记为只读此外,我在独立PC上使用WindowsXP,并且我没有为该文件夹或文件分配任何权限。没有其他进程正在使用该文件如果有帮助,这是发生异常的代码:protectedvoidDeleteImage(stringimageName){if(imageName!=null){stringf=String.Format("~/Images/{0}",imageName);f=System.Web.Hosting.HostingEnvironment.MapPath(f);i

  4. c# - 如何确定字符串是否包含字符串列表的任何匹配项 - 2

    嗨,我有一个字符串列表:varlistOfStrings=newList<string>{"Cars","Trucks","Boats"};我有一个带有名称字段的车辆选项。我想找到名称与listOfStrings中的一项匹配的车辆。我正在尝试使用linq来执行此操作,但目前似乎无法完成。varmatchingVehicles=Vehicles.Where(v=>v.Name==oneofthelistOfStringItem)谁能帮我解决这个问题? 最佳答案 Vehi

  5. c# - 如何在 C# 中进行列表理解(将列表转换为另一个列表的紧凑方式)? - 2

    在我的代码中,我经常有这样的序列:List<type1>list1=...;List<type2>list2=newList<type2>();foreach(type1l1inlist1){list2.Add(myTransformFunc(l1));}在Python中,我可以这样写list2=[myTransformFunc(l1)forl1inlist1]有没有一种用C#编写的紧凑方法? 最佳答案 varnewList=list.Select(x=>YourTransformFunc(

  6. c# - 正则表达式匹配不在引号中的关键字 - 2

    我怎样才能找到不在字符串中的关键字。例如,如果我有文本:Hellothistextisanexample.blablabla"thistextisinsideastring""randomstring"moretextblablabla"foo"我希望能够匹配所有的单词text不在里面"".在其他情况下,我想匹配:请注意,我不想匹配以红色突出显示的文本,因为它在字符串中可能的解决方案:我一直在努力,这是我目前所做的:(?s)((?<q>")|text)(?(q).*?"|)请注意正则表达式将if

  7. 再过半小时,你就能理解Kafka的基本原理了 - 2

    kafka总结一.定义二.基础架构及术语三.工作流程分析3.1发送数据3.2保存数据3.2.1partition结构3.2.2message结构3.2.3存储策略3.2.4消费数据一.定义Kafka是一种高吞吐量的分布式发布订阅消息系统,可以处理消费者规模的网站中的所有动作流数据,具有高性能,持久化,多副本备份,横向扩展能力等。二.基础架构及术语Producer:生产者,消息的生产者,消息的入口Kafkacluster:Broker:brocker是kaf

  8. SkeyeVSS综合安防监控Onvif、RTSP、GB28181视频云无插件直播点播解决方案之系统参数配置日志管理 - 2

    SkeyeVSS综合安防监控Onvif、RTSP、GB28181视频云无插件直播点播解决方案之系统参数配置日志管理1、系统参数配置SkeyeVSS系统参数配置页面如下图所示:其中包括:服务器名称标识为当前SkeyeVSS视频云系统平台的名称,一般以中心管理服务名称命名,也可以自定义设置名称唯一编码唯一编码与当前系统组织架构所属行政职能划分相关,比如当前SkeyeVSS视频云集群部署在四川省-成都市-武侯区,按照GB/T28181行政职能划分,其国标编码ID为51010700032008000001

  9. 小程序码的生成 - 2

    一、生成方式微信小程序提供了三个接口来生成小程序码,分别是wxacode.createQRCode()、wxacode.get()、wxacode.getUnlimited(),生成的小程序码永久有效,其中仅getUnlimited接口生成的小程序码数量暂无限制 二、接口详解1、wxacode.createQRCode参数:access_token(接口调用凭证)、path(扫码进入页面)、width(小程序码宽度)返回值:成功返回的图片Buffer,异常返回错误对象Object注意: 2、wxa

  10. c# - 理解调度队列 - 2

    我想我需要一些帮助来理解DispatcherQueue。当新工作到达时,它会被添加到调度程序队列的开头,而当Dispatcher想要处理工作项时,它会从开头被删除。更一般地说:如果有工作,它将以FIFO方式存储在队列中,并在没有剩余工作时进行处理。MSDN文档here是指loop和frame:Dispatcher在循环中处理工作项队列。循环称为帧。但是在这种情况下循环在哪里?对我来说,循环是指迭代某些东西,当它到达终点时,它会重新开始。frame的概念是什么?根据MSDN文档,一个框架是队列中工作项目的一部分?如果是这样,应该如何使用静态方法Disptatcher.PushFrame(

随机推荐

  1. c# - HttpListener : writing to outputstream slow depending on content? - 2

    删除了旧问题并完全重写,因为我已经为此做了很多工作以查明问题所在。我的问题是我正在使用自定义服务器编写自定义CMS,目标是非常非常高的速度/吞吐量,但是我注意到某些数据或数据模式会导致严重的减速(从0到55+ms响应时间)。我真的需要比我更好的人来帮助解决这个问题,因为我对正在发生的事情一无所知,我怀疑.netFramework中有一个错误,但我不知道它可能在哪里,小的.net代码浏览我没有建议输出Stream做任何特定于数据的事情我已经测试并确定不是问题的东西:内容的大小(内容越大速度越快)内容类型(相同内容类型的区别)周围的大部分代码(制作了一个极简项目来重现该错误,大约15行,找

  2. c# - LINQ to Objects 是否保持其顺序 - 2

    我有一个List<Person>而是想将它们转换为List<string>以进行简单处理,执行以下操作:List<Person>persons=GetPersonsBySeatOrder();List<string>seatNames=persons.Select(x=>x.Name).ToList();Console.WriteLine("Firstinline:{0}",seatNames[0]);是.Select()LINQtoObjects对象上的声明保证不更改列表成员的顺序?假设没有添加明确的不同/分组/排

  3. c# - 在 Visual Studio 2010 中按键入计算代码指标 - 2

    想要改进此帖子?提供此问题的详细答案,包括引用和对答案正确原因的解释。不够详细的答案可能会被编辑或删除。我正在寻找可以在方法体旁边或在我键入时在工具窗口中显示代码指标(尤其是圈复杂度)的扩展(无需额外交互)。目前我知道:CodeMetricesbyElisha:免费且简单。我不知道它计算的是什么指标,但在某处读到它不是圈复杂度。它不支持任何其他指标。CodeMetricAdornmentbyCarpslayer:仅支持代码文件中的代码行、注释和空格。CodeRush:不是免费的。正是我想要的(指标是可选的),不幸的是,我已经在使用ReSharper,而且我认为同时拥有/购买两者是一种矫

  4. c# - 如何以编程方式替换 .NET 程序集中的嵌入式资源? - 2

    我正在尝试使用C#代码替换exe(.NET、C#)文件的资源。我找到了thisarticle并制作了这段代码(使用Mono.Cecil0.6):AssemblyDefinitionasdDefinition=AssemblyFactory.GetAssembly("C:\\File.exe");EmbeddedResourceerTemp=newEmbeddedResource("encFile",ManifestResourceAttributes.Public);erTemp.Data=myNewFileBytes;asdDefinition.Mai

  5. c# - 在 Windows 7 上使用 VB6 注册免费 Com - 2

    我有一些从VB6代码中使用的.NET代码。我一直在XP机器上开发它,方法是创建一个列出相关.NET程序集的VB6.exe.manifest文件。例如,假设我的2个.NET程序集是Some.Assembly.A.dll和Some.Assembly.B.dll,这是VB6.EXE.manifest的样子(我在下面使用version=1.1.0.0,因为是我在AssemblyInfo.cs中的.NETAssemblyVersion上设置的版本):<?xmlversion="1.0"encoding="UTF-8"standalone="yes&#

  6. c# - 通过 COM 包装器从托管代码调用 COM 可见托管组件 - 2

    我有一个第3方组件,可以说FIPreviewHandler来处理预览,它实现了IPreviewHandler。FIPreviewHandler被实现为托管组件,并通过互操作的方式使用IPreviewHandler接口(interface)和相关接口(interface)。FIPreviewHandler是使用regasm.exe作为COM注册的。我有一个也是托管的客户端应用程序。我想在我的应用程序中创建一个FIPreviewHandler实例作为COM组件。我有一个定义IPreviewHandler和相关接口(interface)的互操作程序集。当我使用Activator.Create

  7. c# - 拖放到托管的浏览器控件 - 2

    我有一个在.NET2上编写的WinForms程序,它托管一个网络浏览器控件并从已知服务器呈现asp.net页面。我希望能够将我的winforms应用程序中的TreeView中的树节点拖到托管网页中的特定位置,并让它在那里触发javascript事件。目前,我可以实现IDocHostUIHandler接口(interface)并在浏览器控件上获取拖放事件,然后调用Navigate("javascript:fire_event(...)")控制在页面上执行脚本。但是,我希望它仅在我将数据放在页面的特定部分时起作用。我想,一个解决方案是咬紧牙关,以activex控件的形式编写一个自定义浏览器

  8. c# - 使用 ? 时出现编译器错误。导致无法通过 PEVerify 的不良图像 - 2

    我偶然发现了一些奇怪的事情:我得到了一个BadImageFormatException,但不知道它可能指的是什么图像(程序集)。我缩减了解决方案,使其只包含一个没有依赖项的项目:如您所见,它仅使用System(和mscorlib),当然我不会在运行时加载程序集。它使用.NET4.5.2编译为AnyCpu,使用C#6编译为VS2015,尽管这些都不重要。我尝试用C#5制作一个示例,但是一旦我替换了所有“?”。运营商,它停止发生。我主持了这个项目,以便人们可以自己尝试:gitclone-bcrash-samplehttps://github.com/jtheisen/moldinium.g

  9. c# - 如何从 UI 自动化模式提供程序返回错误? - 2

    假设我在我的自定义控件中实现了一些UIA模式。比如,TablePattern。如果出现任何问题,现有的实现将返回null。但是调试起来不是很方便。我可能在自动化同行中有更多的上下文。例如,对于GetItem(introw,intcolumn),我可能会说提供的参数超出范围,而不仅仅是返回null。如果我从自动化对等端抛出异常-在UIA客户端,我从IUIAutomationPatternInstance对象中获取TargetInvocationException,但没有任何详细信息(InnerException属性为null)。有没有办法让UIA将带有一些附加信息的错误从UIA服务器端传

  10. c# - C# "is"运算符返回不一致的结果 - 2

    我想在C#中使用“is”运算符来检查对象实例的运行时类型。但它似乎并没有像我预期的那样工作。假设我们有三个程序集A1、A2和A3,它们都只包含一个类。A1:publicclassC1{publicstaticvoidMain(){C2c2=newC2();boolres1=(c2.c3)isC3;boolres2=((object)c2.c3)isC3;}}A2:publicclassC2{publicC3c3=newC3();}A3:publicclassC3{}A1需要引用A2和A3。A2需要引用A3。运行Main()后,res1和res2按预期设置为true。当我开始将A3版本化