我正在尝试从 C# 客户端连接到 Go GRPC 服务器,但客户端通道无法连接到服务器。
我希望连接到由 Go 编写和托管的 GRPC 服务器以及用 C# 编写的客户端时应该没有问题。
我的 Go Server 连接是这样设置的:
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("Failed to listen: %v", err)
}
s := grpc.NewServer()
pb.Register**ServiceServer(s, &server{})
reflection.Register(s)
if err := s.Serve(lis); err != nil {
log.Fatalf("Failed to serve: %v", err)
}
Run Code Online (Sandbox Code Playgroud)
这是相当标准的,我知道我的服务器正在工作,因为我能够使用提供的端口与 Go 客户端连接:
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithBlock())
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用 C# 客户端使用Grpc.Net.Client包进行连接时:
var channel = GrpcChannel.ForAddress(@"http://localhost:50051", new GrpcChannelOptions
{
Credentials = ChannelCredentials.Insecure
});
Run Code Online (Sandbox Code Playgroud)
我得到一个Grpc.Core.RpcException: …
我想知道在使用设置的测试用例时,在调用受测系统(SUT)的构造函数之前是否存在为依赖项设置模拟的方法AutoData.
我的SUT看起来像:
class Sut
{
private readonly IFoo foo;
public Sut(IFooFactory factory)
{
this.foo = factory.Build(1, 2);
}
public IFoo Foo
{
get
{
return this.foo;
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以我写的测试看起来像:
[Theory]
[AutoData]
internal void Foo_IsCorrectlySet_Test(
[Frozen] Mock<IFooFactory> fooFactory,
IFoo foo,
Sut sut)
{
fooFactory.Setup(mock => mock.Build(1, 2))
.Returns(foo)
.Verifiable();
var actual = sut.Foo;
Assert.Equal(foo, sut);
fooFactory.Verify();
}
Run Code Online (Sandbox Code Playgroud)
显然,Sut在我能够设置之前,此测试作为运行的构造函数失败IFooFactory.所以我想,我可能已经能够的声明改变Sut,以Lazy<Sut>测试.但是,在运行实际测试代码之前,构造函数仍然运行,这意味着我的测试将失败.
现在我知道我可以轻松地用一个实际Fixture对象设置这个测试并手动创建我的所有对象并在我打电话之前设置它们Sut很好但是我想保持我的测试大致相同因此我'我想知道是否有一种方法,我仍然可以使用AutoData属性设置我的测试但不运行构造函数,直到所有设置完成后?
我正在尝试为我的视图模型创建一个辅助方法,该方法需要执行一系列操作,并且会阻止同时发生的其他操作集合.
我相信这是一个主要的候选者Task.ContinueWith,我的原始硬编码功能在使用这种方法时没有问题,但是当我试图在运行时构建动作时,我遇到的问题是我的任务运行的顺序与我预期的不同.
我的班级看起来像:
internal abstract class ViewModel : IViewModel
{
private readonly AutoResetEvent autoResetEvent = new AutoResetEvent(true);
protected Task SynchronousTask(IList<Action> actions)
{
var initialTask = new Task(() => this.autoResetEvent.WaitOne());
for (var i = 0; i < actions.Count; i++)
{
var i1 = i;
initialTask.ContinueWith(task => actions[i1]());
}
initialTask.ContinueWith(task => this.autoResetEvent.Set());
initialTask.Start();
return initialTask;
}
}
Run Code Online (Sandbox Code Playgroud)
基本上我想等待AutoResetEvent阻止任何新的任务运行,直到设置为止.然后我遍历每个任务,将它们添加为初始任务的延续,最后以一个继续设置结束它AutoResetEvent.
从理论上讲,这看起来应该可行,但是当我运行它时,我最终会以不正确的顺序运行延续.
我知道有其他方法可以在不使用ContinueWiths的情况下完成此操作,但我想知道使用此方法出错的地方和方式.