- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:将在 SO 上公开生产代码!希望没有人窃取我的 secret !
我有一个 Controller 类,用于使用 Modbus 协议(protocol)通过 TCP 与设备通信。我使用 NModbus 库。
Controller 类实现的接口(interface)如下:
public interface CoilReader
{
bool[] Read(ushort startAddress, ushort numberOfCoils);
}
public interface CoilWriter
{
void WriteSingle(ushort address, bool value);
void WriteMultiple(ushort startAddress, bool[] values);
}
public interface HoldingRegisterReader
{
ushort[] Read(ushort startAddress, ushort numberOfRegisters);
}
public interface HoldingRegisterWriter
{
void WriteSingle(ushort address, ushort value);
void WriteMultiple(ushort startAddress, ushort[] values);
}
public interface InputReader
{
bool[] Read(ushort startAddress, ushort numberOfCoils);
}
public interface InputRegisterReader
{
ushort[] Read(ushort startAddress, ushort numberOfRegisters);
}
public interface ConnectionInfo
{
string IP { get; set; }
}
这是 Controller 类。
using System;
using System.Net.Sockets;
using System.Reflection;
using global::Modbus.Device;
public class Controller
: ConnectionInfo,
HoldingRegisterReader,
InputRegisterReader,
CoilReader,
InputReader,
CoilWriter,
HoldingRegisterWriter
{
static Controller()
{
AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => loadEmbeddedAssembly(e.Name);
}
public virtual string IP
{
get
{
return this.ip;
}
set
{
this.ip = value;
}
}
public virtual ushort[] ReadHoldingRegisters(ushort startAddress, ushort numberOfRegisters)
{
using (var connection = this.createDeviceConnection())
{
return connection.ReadHoldingRegisters(startAddress, numberOfRegisters);
}
}
public virtual ushort[] ReadInputRegisters(ushort startAddress, ushort numberOfRegisters)
{
using (var connection = this.createDeviceConnection())
{
return connection.ReadInputRegisters(startAddress, numberOfRegisters);
}
}
public virtual bool[] ReadCoils(ushort startAddress, ushort numberOfCoils)
{
using (var connection = this.createDeviceConnection())
{
return connection.ReadCoils(startAddress, numberOfCoils);
}
}
public virtual bool[] ReadInputs(ushort startAddress, ushort numberOfInputs)
{
using (var connection = this.createDeviceConnection())
{
return connection.ReadInputs(startAddress, numberOfInputs);
}
}
public virtual void WriteSingleCoil(ushort address, bool value)
{
using (var connection = this.createDeviceConnection())
{
connection.WriteSingleCoil(address, value);
}
}
public virtual void WriteMultipleCoils(ushort startAddress, bool[] values)
{
using (var connection = this.createDeviceConnection())
{
connection.WriteMultipleCoils(startAddress, values);
}
}
public virtual void WriteSingleHoldingRegister(ushort address, ushort value)
{
using (var connection = this.createDeviceConnection())
{
connection.WriteSingleRegister(address, value);
}
}
public virtual void WriteMultipleHoldingRegisters(ushort startAddress, ushort[] values)
{
using (var connection = this.createDeviceConnection())
{
connection.WriteMultipleRegisters(startAddress, values);
}
}
string ConnectionInfo.IP
{
get
{
return this.IP;
}
set
{
this.IP = value;
}
}
ushort[] HoldingRegisterReader.Read(ushort startAddress, ushort numberOfRegisters)
{
return this.ReadHoldingRegisters(startAddress, numberOfRegisters);
}
ushort[] InputRegisterReader.Read(ushort startAddress, ushort numberOfRegisters)
{
return this.ReadInputRegisters(startAddress, numberOfRegisters);
}
bool[] CoilReader.Read(ushort startAddress, ushort numberOfCoils)
{
return this.ReadCoils(startAddress, numberOfCoils);
}
bool[] InputReader.Read(ushort startAddress, ushort numberOfInputs)
{
return this.ReadInputs(startAddress, numberOfInputs);
}
void CoilWriter.WriteSingle(ushort address, bool value)
{
this.WriteSingleCoil(address, value);
}
void CoilWriter.WriteMultiple(ushort startAddress, bool[] values)
{
this.WriteMultipleCoils(startAddress, values);
}
void HoldingRegisterWriter.WriteSingle(ushort address, ushort value)
{
this.WriteSingleHoldingRegister(address, value);
}
void HoldingRegisterWriter.WriteMultiple(ushort startAddress, ushort[] values)
{
this.WriteMultipleHoldingRegisters(startAddress, values);
}
private ModbusIpMaster createDeviceConnection()
{
const int port = 502;
var client = new TcpClient();
client.BeginConnect(this.ip, port, null, null).AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(2));
if (!client.Connected)
{
throw new Exception("Cannot connect to " + this.ip + ":" + port);
}
return ModbusIpMaster.CreateIp(client);
}
private static Assembly loadEmbeddedAssembly(string name)
{
if (name.EndsWith("Retargetable=Yes"))
{
return Assembly.Load(new AssemblyName(name));
}
var container = Assembly.GetExecutingAssembly();
var path = new AssemblyName(name).Name + ".dll";
using (var stream = container.GetManifestResourceStream(path))
{
if (stream == null)
{
return null;
}
var bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
return Assembly.Load(bytes);
}
}
private string ip;
}
在与包含此类及其接口(interface)的库相同的解决方案中的测试项目中创建的测试中,我没有收到以下错误。但是,在使用该库的不同解决方案的项目中,我得到以下信息:
------ Test started: Assembly: CareControls.IvisHmi.Tests.dll ------
Unknown .NET Framework Version: v4.5.1
Test 'CareControls.IvisHmi.Tests.Presenters.ModbusTcpTogglePresenterTests.FactMethodName' failed: FakeItEasy.Core.FakeCreationException :
Failed to create fake of type "CareControls.Modbus.Tcp.Controller".
Below is a list of reasons for failure per attempted constructor:
No constructor arguments failed:
No default constructor was found on the type CareControls.Modbus.Tcp.Controller.
If either the type or constructor is internal, try adding the following attribute to the assembly:
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
at FakeItEasy.Core.DefaultExceptionThrower.ThrowFailedToGenerateProxyWithResolvedConstructors(Type typeOfFake, String reasonForFailureOfUnspecifiedConstructor, IEnumerable`1 resolvedConstructors)
at FakeItEasy.Creation.FakeObjectCreator.TryCreateFakeWithDummyArgumentsForConstructor(Type typeOfFake, FakeOptions fakeOptions, IDummyValueCreationSession session, String failReasonForDefaultConstructor, Boolean throwOnFailure)
at FakeItEasy.Creation.FakeObjectCreator.CreateFake(Type typeOfFake, FakeOptions fakeOptions, IDummyValueCreationSession session, Boolean throwOnFailure)
at FakeItEasy.Creation.DefaultFakeAndDummyManager.CreateFake(Type typeOfFake, FakeOptions options)
at FakeItEasy.Creation.DefaultFakeCreatorFacade.CreateFake[T](Action`1 options)
at FakeItEasy.A.Fake[T]()
Presenters\ModbusTcpTogglePresenterTests.cs(22,0): at CareControls.IvisHmi.Tests.Presenters.ModbusTcpTogglePresenterTests.FactMethodName()
0 passed, 1 failed, 0 skipped, took 0.93 seconds (xUnit.net 1.9.2 build 1705).
这是测试:
namespace CareControls.IvisHmi.Tests.Presenters
{
using CareControls.IvisHmi.Framework;
using CareControls.IvisHmi.Presenters;
using CareControls.IvisHmi.UI;
using CareControls.Modbus.Tcp;
using FakeItEasy;
using Ploeh.AutoFixture;
using Xunit;
public class ModbusTcpTogglePresenterTests
{
[Fact]
public void FactMethodName()
{
A.Fake<Controller>();
}
}
}
为什么 FakeItEasy 认为类上没有默认构造函数?
抱歉发了这么大的帖子,但要求我包含代码。
编辑:如果我添加 new Controller()
测试通过在 A.Fake<Controller>()
之前行:
namespace CareControls.IvisHmi.Tests.Presenters
{
using CareControls.IvisHmi.Framework;
using CareControls.IvisHmi.Presenters;
using CareControls.IvisHmi.UI;
using CareControls.Modbus.Tcp;
using FakeItEasy;
using Ploeh.AutoFixture;
using Xunit;
public class ModbusTcpTogglePresenterTests
{
[Fact]
public void FactMethodName()
{
new Controller();
A.Fake<Controller>();
}
}
}
最佳答案
据此:
Faking/mocking an interface gives "no default constructor" error, how can that be?
有一个错误可以给出错误的异常信息。他们说,在那种情况下,仍然应该有一些东西导致抛出异常。
我建议的事情:
Activator.CreateInstance
成功实例化类吗?关于c# - 有默认构造函数时没有默认构造函数报错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22413998/
我正在努力学习本教程 https://github.com/cf-platform-eng/spring-boot-cities/tree/master/cities-service在 Cloud F
0){ echo "Username or email already exists."; }else{ $query = mysql_que
我想在Linux上编译ARToolKit源码,下载源码,按照ARToolKit文档,配置GLUT , OpenGL, libjpeg 等库。 转到 ARToolKit 目录并键入 ./Configer
你好,我在这个程序中遇到错误,wcout 不是 `std' 的成员。如您所见,我也使用了 iostream,但没有用。我有 Dev-C++ 4.9.9.2,我的操作系统是 XP SP3我需要你的帮助。
我尝试对一个网站进行多次投票,但我得到: panic: runtime error: invalid memory address or nil pointer dereference [signal
当我将“ using namespace std; int main(){ string s[30]; int n = 20; for(int i = 0; i using
我设置了 EMAIL_URL process.env.MAIL_URL="smtp://xx%40gmail.com:yyy@smtp.gmail.com:465" 这个工作找到了 Email.sen
我有如下文件夹结构 . ├── docker-compose.yml └── web-app ├── create_tomcat_admin.sh ├── Dockerfile
这是我在 php 中的查询代码: $query3 = mysql_query("SELECT * FROM area_of_work") or die('Invalid query:'. mysql_
我正在尝试将 therubyracer/therubyracer-heroku 安装到我的应用程序,因为它在 heroku 服务器中不起作用,因为我没有 javascript 运行时环境。 当我尝试安
我正在开发一个非常简单的 React 应用程序。它有一个组件,在这个组件中,我试图在单击链接时设置状态。但出于某种原因,setState 甚至没有得到认可。它带有下划线,表示未解析的函数或方法 set
我有三个来源:代码处理.h typedef enum {typeBool, typeVarDeclaration, typeFuncDeclaration } nodeEnum; typedef st
我正在尝试从我的 Android 手机向 raspi 发送连续的命令。我使用了此链接中的代码,但出现错误。 链接:https://stackoverflow.com/questions/2347143
我正在尝试从数据库中加载数据并将其放入不同的 View 中。 log cat 返回错误,它找不到“_id”列。 有人可以帮我解决这个问题吗? SqlHelper代码: public class Fib
我的alertview给出了这个问题..它与sqlite无关..它给出了一些信息.. 我该如何解决这个问题? UIAlertView *infoShow = [[UIAlertView alloc]
这个问题在这里已经有了答案: launch activities from different package (5 个答案) 关闭 10 年前。 最近我一直在开发一个新的应用程序,我正在尝试使用
这是我的代码: #include #include typedef struct test { int *a; char *s; }TEST; int main (void) {
所以我定义了一个函数,如果它是由它的 lonesome 实现的,那么它非常适合对线性数组进行合并排序,但是如果我把它放到一个类中,它就会出错。我认为这是一个很好的例子,说明我不太了解类(class)的
我是 IOS 新手。我有一个示例项目,并试图在此基础上学习 Obj-C。 现在我正处于学习如何使用 UIAlertController 的阶段。我有这样的代码: if (loanAmount == 0
当我尝试使用 wincachegrind 并获取 cachegrind 文件时,它返回 Cannot find call target. cachegrind.out line number:68 有
我是一名优秀的程序员,十分优秀!