1.在vs创建一个标准的单元测试工程

2.引用nuget包:Edge.js

我是用的是6.11.2版本

3.编写JsRunner类

using EdgeJs;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Way.UnitTest
{
class JsRunner:IDisposable
{
static List<JsFileReference> ReferenceConfigs = new List<JsFileReference>();
static List<string> GlobalJSFiles = new List<string>();
/// <summary>
/// 设置js文件依赖
/// </summary>
/// <param name="jsFile">js文件路径</param>
/// <param name="references">所依赖的js文件路径</param>
public static void SetJsReference(string jsFile,IEnumerable<string> references)
{
ReferenceConfigs.Add(new JsFileReference() {
JsFile = jsFile,
References = references,
});
}
/// <summary>
/// 添加全局js文件
/// </summary>
/// <param name="jsFile"></param>
public static void AddGlobalJsFile(string jsFile)
{
GlobalJSFiles.Add(jsFile);
} public JsRunner()
{
JsFiles.AddRange(GlobalJSFiles);
}
~JsRunner()
{
Dispose();
}
List<string> JsFiles = new List<string>();
/// <summary>
/// 添加js文件
/// </summary>
/// <param name="jsPath">js文件路径</param>
public void AddJsFile(string jsPath)
{
putJsFileContentToList(jsPath); } void putJsFileContentToList(string jsPath)
{
if (JsFiles.Contains(jsPath) )
{
return;
}
//查找该js是否引用其他js
var arr = ReferenceConfigs.Where(m => string.Equals(m.JsFile, jsPath, StringComparison.CurrentCultureIgnoreCase));
foreach( var item in arr )
{
foreach( var path in item.References )
{
putJsFileContentToList(path);
}
}
JsFiles.Add(jsPath);
} /// <summary>
/// 运行js代码
/// </summary>
/// <param name="jsCode">一段js代码。如:return data.name;</param>
/// <param name="data">传到js里面的对象,js可以通过data.*直接使用此参数</param>
/// <returns></returns>
public object Run(string jsCode, object data)
{
StringBuilder str = new StringBuilder();
str.AppendLine("var window = {};"); foreach (var path in JsFiles)
{
str.AppendLine(readJsFile(path));
}
str.AppendLine(@"
return function (data, cb) {
cb(null, (function(data){" + jsCode + @"})(data));
}
");
var func = Edge.Func(str.ToString());
var task = func(data);
task.Wait();
return task.Result;
} /// <summary>
/// 读取js文件内容
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
string readJsFile(string filePath)
{
using (System.IO.FileStream fs = System.IO.File.OpenRead(filePath))
{
var data = new byte[fs.Length];
var isUtf8 = IsUTF8(fs);
fs.Position = ;
fs.Read(data, , data.Length);
if (isUtf8)
{
return Encoding.UTF8.GetString(data);
}
else
{
return Encoding.GetEncoding("gb2312").GetString(data);
}
}
} /// <summary>
/// 判断流是否是utf-8编码
/// </summary>
/// <param name="stream"></param>
/// <returns></returns>
static bool IsUTF8(Stream stream)
{
bool IsUTF8 = true; while (stream.Position < stream.Length)
{
byte b = (byte)stream.ReadByte();
if (b < 0x80) // (10000000): 值小于0x80的为ASCII字符
{ }
else if (b < (0xC0)) // (11000000): 值介于0x80与0xC0之间的为无效UTF-8字符
{
IsUTF8 = false;
break;
}
else if (b < (0xE0)) // (11100000): 此范围内为2字节UTF-8字符
{
if (stream.Position >= stream.Length - )
{
break;
}
byte nextByte = (byte)stream.ReadByte();
if ((nextByte & (0xC0)) != 0x80)
{
IsUTF8 = false;
break;
}
}
else if (b < (0xF0)) // (11110000): 此范围内为3字节UTF-8字符
{
if (stream.Position >= stream.Length - )
{
break;
} byte nextByte1 = (byte)stream.ReadByte();
byte nextByte2 = (byte)stream.ReadByte();
if ((nextByte1 & (0xC0)) != 0x80 || (nextByte2 & (0xC0)) != 0x80)
{
IsUTF8 = false;
break;
}
}
else
{
IsUTF8 = false;
break;
}
} return IsUTF8; } public void Dispose()
{
JsFiles.Clear();
}
} class JsFileReference
{
/// <summary>
/// js文件
/// </summary>
public string JsFile;
/// <summary>
/// 所依赖的js文件
/// </summary>
public IEnumerable<string> References; } }

4.编写单元测试基类

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using EdgeJs; namespace Way.UnitTest.Javascript
{
/// <summary>
/// 其他js单元测试,建议继承此类
/// </summary>
[TestClass]
public class JSUnitTest
{
protected static string Mvc_JS_Path;
static JSUnitTest()
{
//组合文件夹路径
var solutionPath = AppDomain.CurrentDomain.BaseDirectory + "\\..\\..\\..\\";
Mvc_JS_Path= solutionPath + @"Content\js\"; //添加全局使用的js文件
JsRunner.AddGlobalJsFile($"{Mvc_JS_Path}\\core1.js");
JsRunner.AddGlobalJsFile($"{Mvc_JS_Path}\\core2.js"); //定义js文件的依赖关系
//设置a.js依赖于b1.js b2.js 两个文件,
//这样,每当使用a.js文件,系统会自动引入b1.js b2.js 两个文件
JsRunner.SetJsReference($"{Mvc_JS_Path}\\a.js", new string[] {
//这里写上所依赖js文件的路径
$"{Mvc_JS_Path}\\b1.js",
$"{Mvc_JS_Path}\\b2.js"
}); } }
}

5.写测试代码

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Way.UnitTest.Javascript
{
[TestClass]
public class Example:JSUnitTest
{
[TestMethod]
public void TestMethod1()
{
using (JsRunner jsEngine = new JsRunner())
{
//添加一个js文件
jsEngine.AddJsFile($"{Mvc_JS_Path}\\a.js"); //编写js代码
var js = @"
return data.name.StartWith('JA');
";
//运行js代码
var result = jsEngine.Run(js, new { name = "JACK" });
if ((bool)result != true)
throw new Exception("运算结果错误");
}
}
}
}

用C#在Visual Studio写Javascript单元测试的更多相关文章

  1. 用C#在Visual Studio写Javascript单元测试(Firefox内核)

    引用nuget包: 注意:Geckofx45 nuget包必须是最后引用,否则初始化会出错 编写JsRunner using Gecko; using System; using System.Col ...

  2. Visual Studio 中的单元测试 UNIT TEST

    原文:Visual Studio 中的单元测试 UNIT TEST 注:本文系作者原创,可随意转载,但请注明出处.如实在不愿注明可留空,强烈反对更改原创出处.TDD(Test-Driven Devel ...

  3. 基于Visual Studio .NET2015的单元测试

    基于Visual Studio .NET2015的单元测试 1.    在Visual Studio .NET2015中创建任意项目. 2.    在某个公共类的公共方法的名称上面点击右键,选择“创建 ...

  4. 基于Visual Studio .NET2015的单元测试 OpenCover

    https://www.cnblogs.com/XiaoRuLiang/p/10095723.html 基于Visual Studio .NET2015的单元测试 1.    在Visual Stud ...

  5. Visual Studio中UnitTesting单元测试模板代码生成

             在软件研发过程中,单元测试的重要性直接影响软件质量.经验表明一个尽责的单元测试方法将会在软件开发的某个阶段发现很多的Bug,并且修改它们的成本也很低.在软件开发的后期阶段,Bug的发 ...

  6. Visual Studio 2013进行单元测试

    使用Visual Studio 2013进行单元测试--初级篇   1.打开VS2013 --> 新建一个项目.这里我们默认创建一个控制台项目.取名为UnitTestDemo 2.在解决方案里面 ...

  7. 使用Visual Studio 2013进行单元测试

    使用Visual Studio 2013进行单元测试 1.打开VS2013 --> 新建一个项目.这里我们默认创建一个控制台项目.取名为UnitTestDemo 2.在解决方案里面新增一个单元测 ...

  8. Visual Studio(VS)C++单元测试

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Visual Studio(VS)C++单元测试     本文地址:http://techie ...

  9. 1,[VS入门教程] 使用Visual Studio写c语言 入门与技巧精品文~~~~下载安装篇

    Microsoft Visual Studio是微软(俗称巨硬)公司出品的强大IDE(Integrated Development Environment 集成开发环境),功能强大齐全,界面舒服之类的 ...

随机推荐

  1. 行香子&#183;过尽千山

    <行香子·过尽千山> 文/天地尘埃2020 过尽千山.水瘦山寒. 思来路.地咽天玄. 千金散尽,欲补穹天. 但孟春暖,仲春炫.暮春喧. 三皇五帝,魏武挥鞭. 朴无欲.衡玉玑璿. 金生丽水, ...

  2. C#之out和ref区别

    out与ref的区别总结:1.两者都是通过引用来传递.2.两者都按地址传递的,使用后都将改变原来参数的数值.3.属性不是变量,因此不能作为 out或ref 参数传递.4.若要使用 ref 或 out, ...

  3. leetCode 54.Spiral Matrix(螺旋矩阵) 解题思路和方法

    Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matri ...

  4. Cadence——每次启动软件弹出找不到license文件的提示窗口

    1. 摘要 按照Cadence16.60,每次启动该软件,总弹出提示窗口,内如大致为:Orcad Capture license was not found.... 2. 解决方法 参考此链接:htt ...

  5. bzoj2538: [Ctsc2000]公路巡逻

    超车这个东西这么恶心肯定是要暴力求的(自圆其说) 那么分成一个个时间段来搞,然后DP一下 化一下那个速度,耗费时间是在300s~600s之间的 那我们就可以设f[i][j]为走到第i个位置用了j的时间 ...

  6. Black Rock Shooter

    在人气动漫 Black Rock shooter 中,当加贺里对麻陶 说出了"滚回去"以后,与此同时,在另一个心灵世界里, BRS 也遭到了敌人的攻击.此时,一共有 n 个攻击排成 ...

  7. 异常值检测(Detecting Outliers)

    Most statistical approaches to outlier detection are based on building a probability distribution mo ...

  8. 作业训练------通过读取c.txt文件中的内容等号右值,并将右值的最大值、最小值、平均值打印到屏幕上。

    这篇博客是学习传智播客c++教程的作业,通过在网上进行搜集来完成,但是网上有相似的代码,但是结果总是有点问题,所以本文写了这篇记录下. #include <stdio.h> #includ ...

  9. [Swift通天遁地]二、表格表单-(11)创建星期选项表单和拥有浮动标签的文本框

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  10. SpringBoot2.0整合Redission

    Redisson是redis一个很强大的客户端,有兴趣的同学可以看我的下一篇文章,这篇主要讲如何整合,费话不多说,直接上干货(大牛请绕道) 首先创建RedissionConfig文件 import o ...