Pose 1.2.1
dotnet add package Pose --version 1.2.1
NuGet\Install-Package Pose -Version 1.2.1
此命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的 Install-Package 版本。
<PackageReference Include="Pose" Version="1.2.1" />
对于支持 PackageReference 的项目,请将此 XML 节点复制到项目文件中以便引用包。
paket add Pose --version 1.2.1
NuGet 团队不提供对此客户端的支持。请联系其 维护者 以获得支持。
#r "nuget: Pose, 1.2.1"
#r 指令可用于 F# Interactive 和 Polyglot Notebooks。将此内容复制到交互工具或脚本的源代码中,以便引用包。
// Install Pose as a Cake Addin #addin nuget:?package=Pose&version=1.2.1 // Install Pose as a Cake Tool #tool nuget:?package=Pose&version=1.2.1
NuGet 团队不提供对此客户端的支持。请联系其 维护者 以获得支持。
Pose
Pose 允许您用委托替换任何 .NET 方法(包括静态和非虚拟方法)。它与 Microsoft Fakes 类似,但与它不同,Pose 完全是用托管代码(Reflection Emit API)实现的。所有操作都在运行时和内存中发生,没有非托管分析 API,也没有通过重写程序集来污染文件系统。
Pose 是跨平台的,可在任何支持 .NET 的地方运行。它针对 .NET Standard 2.0,因此可以在包括 .NET Framework、.NET Core、Mono 和 Xamarin 在内的 .NET 平台上使用。有关版本兼容性表,请参阅此处。
安装
在 NuGet 可用
Visual Studio
PM> Install-Package Pose
.NET Core CLI
dotnet add package Pose
用法
Pose 允许您通过 Shim
类创建 shims。Shim 是基本对象,可以指定要替换的方法以及替换的委托。委托签名(参数和返回类型)必须与它们要替换的方法相匹配。Is
类用于创建类型的实例,所有要应用 shims 的代码都使用 PoseContext
类进行隔离。
静态方法 Shim
using Pose;
Shim consoleShim = Shim.Replace(() => Console.WriteLine(Is.A<string>())).With(
delegate (string s) { Console.WriteLine("Hijacked: {0}", s); });
静态属性获取器 Shim
using Pose;
Shim dateTimeShim = Shim.Replace(() => DateTime.Now).With(() => new DateTime(2004, 4, 4));
静态属性设置器 Shim
using Pose;
Shim setterShim = Shim.Replace(() => Console.Title, true).With((string title) => { Console.Title = "My Title"; });
实例属性获取器 Shim
using Pose;
class MyClass
{
public int MyProperty { get; set; }
public void DoSomething() => Console.WriteLine("doing someting");
}
Shim classPropShim = Shim.Replace(() => Is.A<MyClass>().MyProperty).With((MyClass @this) => 100);
实例属性设置器 Shim
using Pose;
Shim classPropShim = Shim.Replace(() => Is.A<MyClass>().MyProperty, true).With((MyClass @this, int prop) => { @this.MyProperty = prop * 10; });
构造函数 Shim
using Pose;
Shim ctorShim = Shim.Replace(() => new MyClass()).With(() => new MyClass() { MyProperty = 10 });
引用类型的实例方法 Shim
using Pose;
Shim classShim = Shim.Replace(() => Is.A<MyClass>().DoSomething()).With(
delegate (MyClass @this) { Console.WriteLine("doing someting else"); });
备注:实例方法替换委托的第一个参数总是类的实例
引用类型特定实例的Shim方法
using Pose;
MyClass myClass = new MyClass();
Shim myClassShim = Shim.Replace(() => myClass.DoSomething()).With(
delegate (MyClass @this) { Console.WriteLine("doing someting else with myClass"); });
值类型Shim实例方法
using Pose;
Shim structShim = Shim.Replace(() => Is.A<MyStruct>().DoSomething()).With(
delegate (ref MyStruct @this) { Console.WriteLine("doing someting else"); });
注意:您无法在值类型的特定实例上Shim方法
隔离您的代码
// This block executes immediately
PoseContext.Isolate(() =>
{
// All code that executes within this block
// is isolated and shimmed methods are replaced
// Outputs "Hijacked: Hello World!"
Console.WriteLine("Hello World!");
// Outputs "4/4/04 12:00:00 AM"
Console.WriteLine(DateTime.Now);
// Outputs "doing someting else"
new MyClass().DoSomething();
// Outputs "doing someting else with myClass"
myClass.DoSomething();
}, consoleShim, dateTimeShim, classPropShim, classShim, myClassShim, structShim);
注意事项与限制
- 断点 - 目前,在隔离代码及其执行路径的任何地方设置的断点都不会被触发。但是,在Shim替代委托中设置的断点会被触发。
- 异常 - 目前,在隔离代码及其执行路径中抛出的所有未处理的异常都始终封装在
System.Reflection.TargetInvocationException
。
路线图
- 性能改进 - Pose可以在单元测试以外的上下文中使用。更好的性能会使它适合在生成代码中使用,可能用于覆盖旧功能。
- 异常堆栈跟踪 - 目前,当在隔离的代码中抛出异常时,提供的异常堆栈跟踪相当混乱。需要提供一个未稀释的异常堆栈跟踪。
问题与贡献
如果发现问题或功能请求,请在 repository 的问题部分报告它们。贡献非常欢迎,但对于非常小的更改,请先提交一个问题,并在您打开 pull request 之前让我们进行讨论。
许可
此项目受MIT许可证授权。有关更多信息,请参阅LICENSE文件。
产品 | 版本 兼容和附加计算目标框架版本。 |
---|---|
.NET | net5.0 已计算。 net5.0-windows 已计算。 net6.0 已计算。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。 |
.NET Core | netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。 |
.NET Standard | netstandard2.0 兼容。 netstandard2.1 已计算。 |
.NET Framework | net461 已计算。 net462 已计算。 net463 已计算。 net47 已计算。 net471 已计算。 net472 已计算。 net48 已计算。 net481 已计算。 |
MonoAndroid | monoandroid 已计算。 |
MonoMac | monomac 已计算。 |
MonoTouch | monotouch 已计算。 |
Tizen | tizen40 已计算。 tizen60 已计算。 |
Xamarin.iOS | xamarinios 已计算。 |
Xamarin.Mac | xamarinmac 已计算。 |
Xamarin.TVOS | xamarintvos 已计算。 |
Xamarin.WatchOS | xamarinwatchos 已计算。 |
-
.NETStandard 2.0
- Mono.Reflection.Core (>= 1.1.1)
- System.Reflection.Emit.Lightweight (>= 4.3.0)
NuGet 包
该包不被任何 NuGet 包使用。
GitHub 仓库 (1)
显示依赖于 Pose 的最受欢迎的 GitHub 仓库(共 1 个)
仓库 | 星星数 |
---|---|
toddams/RazorLight
基于 Microsoft 的 Razor 解析引擎的模板引擎,用于 .NET Core
|