小编Joh*_*las的帖子

MOQ - 如何模拟需要转换为另一个接口的接口?

我想要做的是为I1构建一个moq - 这很好......但是在我测试的方法过程中使用这个模拟我需要将它转换为I2才能访问一些不在的属性I1

Interface I1 
{ int AProperty{get;set;}}

Interface I2
{int AnotherProperty{get;set;}}
Run Code Online (Sandbox Code Playgroud)

然后我有一些对象

Class O1 : I1 {}
Run Code Online (Sandbox Code Playgroud)

Class O2 : O1 , I2 {}
Run Code Online (Sandbox Code Playgroud)

问题是,当我有一个I2实现对象的实例时,我可以将它转换为I1,以便访问通过该接口实现的方法.在代码中,这不是问题,并且每个标志都按预期工作.

在该类上编写单元测试时,唯一的问题就出现了.

接口还公开了一个名为GetNewInstance的方法,该方法返回一个初始化的实现对象实例,该实例对象被转换为IGetNewInstance接口...我通常可以模拟这个并使其自行返回(因此我继续使用模拟对象).

但是,当您尝试将此类型I2的返回对象转换为I1时,将引用空引用 - 这是有意义的,因为实现I2的模拟对象不会从继承I1的任何内容继承.

问题是我如何强制模拟对象同时从I1和I2继承?

inheritance unit-testing interface moq

66
推荐指数
1
解决办法
2万
查看次数

IErrorHandler似乎没有处理我在WCF中的错误..任何想法?

一直在浏览IErrorHandler并想要配置路由.所以,我已经阅读了以下内容,试图实现它.

MSDN

关于类型定义的Keyvan Nayyeri博客

Rory Primrose博客

这基本上只是包含在继承IErrorHandler和IServiceBehaviour的类中的msdn示例...然后它包含在继承自BehaviourExtensionElement的Extension元素中,据称允许我将该元素添加到web.config中.我错过了什么?

我已经得到它编译,并从我已修复的各种错误,似乎WCF实际上加载错误处理程序.我的问题是我在错误处理程序中处理的异常不会导致传递给它的异常.

我的服务实现只是在另一个抛出ArgumentOutOfRangeException的类上调用一个方法 - 但是这个异常永远不会被处理程序处理.

我的web.config

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="basic">
          <security mode="None" />                      
        </binding>
      </basicHttpBinding>
    </bindings>
    <extensions>
      <behaviorExtensions>
        <add name="customHttpBehavior"
             type="ErrorHandlerTest.ErrorHandlerElement, ErrorHandlerTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      </behaviorExtensions>
    </extensions>
    <behaviors>
      <serviceBehaviors>
        <behavior name="exceptionHandlerBehaviour">          
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <customHttpBehavior />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="exceptionHandlerBehaviour" name="ErrorHandlerTest.Service1">
        <endpoint …
Run Code Online (Sandbox Code Playgroud)

wcf ierrorhandler

24
推荐指数
1
解决办法
1万
查看次数

单元测试代码,使用Task.Factory.StartNew().ContinueWith()

所以我有一些代码

Task.Factory.StartNew(() => this.listener.Start()).ContinueWith(
                    (task) =>
                        {
                            if (task.IsCompleted)
                            {
                                this.status = WorkerStatus.Started;
                                this.RaiseStatusChanged();
                                this.LogInformationMessage("Worker Started.");
                            }
                        });
Run Code Online (Sandbox Code Playgroud)

当我测试时,我正在模拟所有依赖对象(namley this.listener.Start()).问题是测试在ContinueWith被调用之前完成执行.当我调试时,由于我单步执行代码的额外延迟,它被称为罚款.

那么我怎么能 - 从不同程序集中的测试代码 - 确保代码在我的测试遇到其断言之前运行?

我可以使用Thread.Sleep ......但这似乎是一种真正的hacky方式.

我想我正在寻找Thread.Join的Task版本.

c# nunit unit-testing moq task-parallel-library

13
推荐指数
1
解决办法
7441
查看次数

初始化显式构造函数之外的字段是不好的做法

可能重复:
在构造函数或声明中初始化类字段?

我们正在争论编码实践.这里的例子有点过于简单,但真正的交易有几个构造函数.为了初始化简单值(例如日期到它们的最小值),我已经将代码移出构造函数并进入字段定义.

public class ConstructorExample
{
    string _string = "John";
}

public class ConstructorExample2
{
    string _string;

    public ConstructorExample2()
    {
        _string = "John";
    }
}
Run Code Online (Sandbox Code Playgroud)

这本书怎么做?我倾向于非常具体,所以对这种事情可能有点松懈.但是我觉得occams razor告诉我将初始化移出多个构造函数.当然,我总是可以将这个共享初始化转移到私有方法中.

问题本质上是...正在初始化定义它们的字段而不是构造函数以任何方式变坏?

我所面临的论点是错误处理之一,但我不认为它是相关的,因为没有可能的异常在编译时不会被接收.

c# constructor initialization

12
推荐指数
2
解决办法
5130
查看次数

*ngFor:#vs let的意思?

我从angular2开始并遇到了两种不同的语法,但我不确定它们的区别 - 或者说它们是如何工作的.

我看到了这个:

 <select class="form-control" required
      [(ngModel)]="model.power"
        ngControl="power" #power="ngForm" >
      <option *ngFor="let p of powers" [value]="p">{{p}}</option>
    </select>
Run Code Online (Sandbox Code Playgroud)

但这也有效

<div *ngFor="#game of games" (click)="gotoGame(game)" class="col-1-4">
        <span>{{game.id}}</span>{{game.name}}
        <br> {{game.description}}
        <br> {{game.genre.name}}
  </div>
Run Code Online (Sandbox Code Playgroud)

是一个只是另一个的别名?一个优于另一个的优点是什么?

angular

11
推荐指数
1
解决办法
7933
查看次数

我希望能够使用lambda表达式来指定要通过wcf服务返回的值范围

我不知道这是否可能......但它会很酷.问题是它是否可能,但如果可能的话,那就是一个例子.

我不确定您将使用什么方法签名来传递lambda表达式.

例如方法 IList<Group> GetGroups()

你如何修改它以便能够将lambda表达式传递给它?

接下来的问题是如何编写lambda表达式以返回所有Group对象,例如

  • where .deleted == false 要么
  • where .DateAdded > aDate

是的,我想把月亮放在棍子上;)先谢谢你.

(编辑我认为这实际上有点不合理,因为实际上会获取数据的数据访问层...但是假设您正在通过服务查询某些对象集合而不必担心dal ).

c# wcf lambda delegates

6
推荐指数
1
解决办法
888
查看次数

Linq2Sql - 尝试更新,但sql中的Set语句为空

这很奇怪...之前已经完成了很多次更新,但无法发现为什么会有所不同.虽然我现在使用.net 4.0 - 但我怀疑它的L2S实现中的一个错误.它不像是一个奇怪而精彩的应用程序.虽然我很确定这个代码在我使用RC时有效.

我还设法通过使用以下信息从头开始构建项目来重现此错误.

这里的问题是L2S生成的更新语句在set语句中没有字段.我已经尝试检查pk是否已设置(只是为什么我认为在其中需要ervery字段的原因)并且还读取了其他dbml属性的aroudn.我一直在使用linq2Sql大约1年,从来没有遇到过问题.我仍然认为我只是有一个巨大的脑屁.

注意:我已经清理了equals和GetHashCode方法来删除一些字段 - 此后问题仍然存在.我还没有清理SQL.

我有一个来自dbml的客户端类,我添加了一个名为update的方法

public partial class Client :  ICopyToMe<Client>
Run Code Online (Sandbox Code Playgroud)

CopyToMe方法继承自接口

   public  interface ICopyToMe<T>
    {
        void CopyToMe(T theObject);
    }
Run Code Online (Sandbox Code Playgroud)

该类还覆盖了getHashCode

public override int GetHashCode()
{
    int retVal = 13 ^ ID ^ name.GetHashCode();
    return retVal;
}
Run Code Online (Sandbox Code Playgroud)

和平等

public override bool Equals(object obj)
{
    bool retVal = false;
    Client c = obj as Client;
    if (c != null)
        if (c.ID == this.ID && c._name == this._name)
            retVal = true;
    return retVal;
} 
Run Code Online (Sandbox Code Playgroud)

部分类中的更新方法

 public void …
Run Code Online (Sandbox Code Playgroud)

.net c# sql insert-update linq-to-sql

6
推荐指数
1
解决办法
321
查看次数

将csv加载到oleDB中并强制所有推断的数据类型为字符串

我试图使用oledb将csv文件加载到数据表中.

这没有问题,但不幸的是,其中一个看起来很数字的字段在字段中有大约3%的字符串值,因此没有填充.

因为我将csv转换为xml我真的不关心推断数据类型,只需要字符串中的数据,因为我可以稍后在Linq2XMl阶段投出它.

我希望能够在连接字符串中执行此操作.

我不想只是复制表,使用我想要的数据类型的新列进行设置,然后将数据写入其中,因为这将涉及加载csv文件两次.

有任何想法吗?

我当前的连接字符串是

Provider = Microsoft.Jet.OLEDB.4.0; Data Source ="+ thefile.DirectoryName +"; Extended Properties ='text; HDR = Yes; FMT = Delimited'";

c# csv oledb connection-string

5
推荐指数
1
解决办法
2万
查看次数

从 OTG 为以太网卡分配静态 IP

我想为以太网卡分配静态 IP,通过 OTG 电缆连接到 Android 设备。它应该以编程方式完成,但我找不到有关 android 中以太网卡的任何参考。

有任何想法吗?

谢谢

android ethernet

5
推荐指数
1
解决办法
4113
查看次数

Ioc中繁忙的构造函数 - 它们是代码味道吗?

我最终得到了一个看起来像这样的构造函数,同时试图找到一个我可以轻松测试的对象.

 public UserProvider(
            IFactory<IContainer> containerFactory,
            IRepositoryFactory<IUserRepository> userRepositoryFactory,
            IFactory<IRoleProvider> roleProviderFactory,
            IFactory<IAuthenticationProvider> authenticationProviderFactory,
            IFactory<IEmailAdapter> emailAdapterFactory,
            IFactory<IGuidAdapter> guidAdapterFactory,
            IRepositoryFactory<IVehicleRepository> vehicleRepositoryFactory,
            IRepositoryFactory<IUserVehicleRepository> userVehicleRepositoryFactory,
            IFactory<IDateTimeAdapter> dateTimeAdapterFactory)
Run Code Online (Sandbox Code Playgroud)

这是对象将拥有的所有依赖项,并且是我拥有的最繁忙的构造函数.但是,如果有人看到这会真的提高一个重要的wtf?

我的目标是最终得到易于测试的逻辑.虽然它需要大量的模拟,但它确实很容易验证我的逻辑.但是我担心我可能会得到太多好事.

我很好奇大多数人实施ioc是否正常.

我可以做几个简化 - 比如我真的不需要为几个适配器传递工厂,因为我可以直接传递适配器,因为它没有内部状态.但我真的在询问参数的数量.

或者更重要的是,我正在寻找保证我不会过火;)

但我现在开始认为UserProvider类应该被打破一点 - 但最终我得到了更多的管道,这正是推动这一问题的原因.

我猜一个子问题是,如果我有这些顾虑,我应该考虑使用服务定位器模式吗?

.net c# constructor design-patterns inversion-of-control

3
推荐指数
1
解决办法
472
查看次数

单元测试:私有方法以及如何重构

我喜欢单元测试,它证明了它在过去一年半的时间里非常值得使用它.但是我总是有一个问题,或者更确切地说是私有方法(和受保护的).

我不想让它们公开或使用属性可见的内部.我想要一个干净清晰的解决方案 - 这是可以测试的,我很自豪能让别人看一看.

我得出的结论是,如果私有方法确实需要独立测试,那么它可能应该被移出到另一个接口并使用关联来向调用方法公开功能.我相信这实际上是Facade模式.

这真的是最好的方法吗?或者更客观地......有没有其他方法我完全被忽视了?

编辑:我们在谈论特定的语言吗?我在C#工作.因为我正在寻找抽象的东西,所以我保留了代码.回到今天,我意识到这可能是愚蠢的,因为语言真的与众不同.

所以一些代码:

public class CopmlexClass
{
    public void SomeMethod()
    { }

    private void workerMethod()
    { }
}
Run Code Online (Sandbox Code Playgroud)

会被重新考虑进去

public class CopmlexClass
{
    public void SomeMethod()
    { }

    public IComplexClassWorker Worker { get; set; }

}

public interface IComplexClassWorker
{
    void WorkerMethod();        
}
Run Code Online (Sandbox Code Playgroud)

事实上,id可能更喜欢使用构造函数注入,甚至不暴露属性

我的问题是:这是最好的方法吗?什么是替代条形反射/内部属性可见?

refactoring unit-testing design-patterns

2
推荐指数
1
解决办法
1075
查看次数

样式按钮图像仅适用于最后一项

我有一种风格

<Style x:Key="HomeButtonStyle" TargetType="Button">
    <Setter Property="Height" Value="32"/>
    <Setter Property="Width" Value="32"></Setter>
    <Setter Property="Content">
        <Setter.Value>
            <Image Source="/Images/HOME.png"></Image>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

我在控件中有一些xaml

    <StackPanel Grid.Row="0" Orientation="Horizontal">
        <Button Style="{DynamicResource HomeButtonStyle}" />
        <Button Style="{DynamicResource HomeButtonStyle}" />
        <Button Style="{DynamicResource HomeButtonStyle}" />
        <Button Style="{DynamicResource HomeButtonStyle}" />
    </StackPanel>
Run Code Online (Sandbox Code Playgroud)

但是,图像仅显示在最后一个按钮中.

我的问题是为什么?以及如何在所有按钮中显示图像?

wpf

2
推荐指数
1
解决办法
668
查看次数

嵌套分叉的正确模式

我有一个有许多孩子的演员,我正在查询它以获得其子女的数据汇总.此操作可能需要几秒钟.

我即将这样做,感觉非常错误.handle方法由a调用Ask<>.

public void Handle(Message message)
{
    var children = Context.GetChildren();
    var tasks = new List<Task<Result>>();

    foreach (var child in children)
    {
        var t = child.Ask<Result>(new Query);
        tasks.Add(t);
    }

    Task.WaitAll(tasks.ToArray()); // Gah!
    // do some work
    Sender.Tell(new Response(new Results()));
}
Run Code Online (Sandbox Code Playgroud)

我有一些想法,但想得到一些意见,因为我真的不想重新发明一个20边的车轮.

Sender当我最终调用Tell它时,我担心引用和它将指向什么,因为它是一个静态调用.

我最终使用了Task.WhenAll延续,但仍然不相信它是正确的Akka方式 - 这就是重点.我可以使它工作,我只想知道最佳实践选项.

c# akka.net

1
推荐指数
1
解决办法
725
查看次数