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. 微軟将弃用 System.Data.OracleClient

    http://www.cnblogs.com/WizardWu/archive/2010/05/17/1737009.html 微軟将从 .NET 4 以后的版本弃用 System.Data.Orac ...

  2. 第6章 TCP/IP路由协议故障处理

    第6章 TCP/IP路由协议故障处理 一.缺省网关 当包的目的地址不在路由器的路由表中,如路由器配置了缺省网关,则转发到缺省网关,否则就丢弃. Show ip route :查看Cisco路由器的缺省 ...

  3. Android时间轴效果,直接使用在你的项目中

    近期开发app搞到历史查询,受腾讯qq的启示,搞一个具有时间轴效果的ui,看上去还能够,然后立即想到分享给小伙伴,,大家一起来看看,先上效果图吧 watermark/2/text/aHR0cDovL2 ...

  4. 我所不知的 javascript Object 的一些现象

    1.我们都知道对象访问属性有两种方法,一种是使用 . 操作符,使用它添加的属性名必须满足标识符的命名规范:另一种是使用 [] 键访问的方法,可以接受任意UTF-8/Unicode字符串作为属性名,在E ...

  5. ORA-00904:&quot;T1&quot;.&quot;AREA_ID&quot; :标识符无效

    1.错误描写叙述 ORA-00904:"T1"."AREA_ID" :标识符无效 00904 . 00000 - "%s:invalid identi ...

  6. mysql 常用查询语句记录

    SELECT DISTINCT CONCAT('User: ''',USER,'''@''',HOST,''';') AS QUERY FROM mysql.user; GRANT USAGE ON ...

  7. Tyvj 1068 巧用扩展KMP

    Tyvj1068 给定两个长度为2*10^5的字符串为A和B 求B在A中匹配后,任意匹配长度的位置个数. KMP算法大家应该烂熟于心才好,这样碰到这样的题才能灵活运用.有时做题真的需要一点灵感.首先, ...

  8. mysql sql执行错误#1436 Thread stack overrun

    1.mysql调用存储过程  call proc1() 时报错:Thread stack overrun: 6656 bytes used of a 8496 byte stack, and 1280 ...

  9. ASP.NET MVC5 之 Log4Net 的学习和使用

    最近在学习 log4Net 插件,在博客园找到了好多资料,但是实现起来还是有点麻烦. 现在记录下学习的过程,期间可能加载着借鉴和转载的代码. 1.配置文件的设置: 新建config文件夹下 log4n ...

  10. 自己做的一个android 音视频播放器

    欢迎大家下载: http://download.csdn.net/detail/q610098308/8504335