小编Owe*_*enP的帖子

我应该重复测试以方便过载吗?

对我来说,为方法做出方便的重载是很常见的.这是我可能会做的一个例子:

public void Encode(string value) {
    Encode(value, DefaultEncoding);
}

public void Encode(string value, Encoding encoding) { 
    // ... 
}
Run Code Online (Sandbox Code Playgroud)

我开始更加关注单元测试,这样的测试方法引入了一些障碍,我不确定我是否相信自己单独进行测试.第一个也是最重要的问题是我是否应该重复两个重载的测试.例如,如果value为null ,则两个方法都应该抛出ArgumentNullException ; 是否更正确地认识到可能存在不同的逻辑并编写两个测试,或者更好地假设方便过载没有自己的逻辑?

我也遇到了次要问题.我的命名方案与Roy Osherove的相同:"MemberName_State_ExpectedResult".如果我复制测试,那么我会在没有引入一些古怪的命名约定的情况下发生冲突.如果复制测试,你如何处理?

unit-testing overloading

13
推荐指数
2
解决办法
1031
查看次数

WinForms应用程序中的自定义标题栏/镶边

我几乎可以肯定我知道这个问题的答案,但我希望有一些我忽略的东西.

某些应用程序似乎在其标题栏和按钮上具有Vista Aero外观和感觉,即使在Windows XP上运行也是如此.(谷歌浏览器和Windows Live照片库作为例子浮现在脑海中.)我知道从WinForms实现这一目标的一种方法是创建一个无边框表单并自己绘制标题栏/按钮,然后重写WndProc以确保移动,调整大小,和按钮点击做了他们应该做的事情(我不清楚具体细节,但可能会花一天时间阅读文档.)我很好奇,如果有一个不同的,更容易的方式,我忽略.也许我忽略了一些API调用或窗口样式?

我相信Google已经通过Chrome使用自己动手操作的方法为我解答了这个问题.如果有人有新信息,我会将问题留待另一天,但我相信我已经自己回答了这个问题.

.net user-interface windows-xp winforms

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

什么是WPF相当于WinForms组件?

Windows窗体允许您开发可以拥有设计器的组件,非可视元素.内置组件包括BackgroundWorker,Timer和许多ADO .NET对象.这是一种提供简单配置复杂对象的好方法,它可以实现设计人员辅助的数据绑定.

我一直在看WPF,它似乎没有任何组件的概念.我这是对的吗?是否有一些创建我错过的组件(或类似组件)的方法?

我已经接受了鲍勃的回答,因为经过大量的研究后,我觉得花哨的Adorners可能是唯一的方法.

wpf components winforms

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

如何在log4net中注册自定义IObjectRenderer?

我正在研究使用log4net,我发现IObjectRenderer接口很有趣.它将允许我们控制类型的记录方式,并提供不同的,可能更加用户友好的ToString()实现.我刚刚开始查看log4net,似乎找不到以编程方式设置类型和渲染器之间关联的逻辑方法.

我发现这可以通过阅读手册在XML配置文件中设置,但它没有给我任何关于以编程方式添加这些内容的提示.在我看来,在某些情况下你宁愿使用程序化对象渲染器,所以我很好奇如何做到这一点.

c# log4net

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

有一个简单的方法来制作一个令人愉快的mediawiki表吗?

我在拇指驱动器上使用MediaWiki实例来跟踪大量内容.在过去,我一直很匆忙,所以我没有机会寻找一个很好的制作表的方法,所以这个语法很好地满足了我的目的:

{| border=1
...
|}
Run Code Online (Sandbox Code Playgroud)

现在我想要一些更好的东西; 我习惯使用CSS来制作更好的表格边框,但我找不到通过MediaWiki做这种语法的简洁方法.基本上,我想要一个看起来与这个HTML相同的表:

<table style="border-collapse: collapse">
    <tr>
        <td style="border: 1px solid black">one</td>
        <td style="border: 1px solid black">two</td>
    </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

在每个单元格上设置边框将很困难.我最初的猜测是我需要在某个地方为CSS文件添加一个表类; 如果是的话,可以在哪里找到合适的文件?

mediawiki

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

什么策略可以在库中使用IoC容器?

其余问题的更短版本:我遇到了问题,而IoC容器是一个工具.问题听起来像是IoC可以解决的问题,但我还没有阅读足够的工具说明以确定.我很好奇,如果我选错了工具或说明书的哪一章我可以跳过去寻求帮助.

我在Windows窗体控件库上工作.在过去的一年里,我偶然发现了单元测试,并对提高自动化测试的质量充满热情.测试控制很困难,并且在线没有太多关于它的信息.其中一个令人讨厌的事情是交互逻辑与UI胶水的分离,它调用它导致每个控件具有比我通常认为对于类健康更多的依赖性.在测试它们与控件的集成时为这些元素创建假货非常繁琐,我正在研究IoC的解决方案.

有一个障碍我不确定如何克服.要设置容器,您需要有一些在应用程序其余部分之前运行的引导程序代码.在一个应用程序中,这个东西有一个非常明确的地方.在图书馆,它不是那么清楚.

想到的第一个解决方案是创建一个类,该类提供容器的静态实例,并在其类型初始值设定项中设置容器.这适用于运行时,但在测试环境中,我不确定它的效果如何.允许测试并行运行,许多测试需要不同的依赖关系,因此静态共享状态将是一场噩梦.这让我相信容器创建应该是一个实例方法,但是我有一个鸡和蛋问题,因为控件必须在它创建自己之前构造它的容器.想到控件的类型初始值设定项,但我的测试将无法修改此行为.这让我想到使容器本身成为控件的依赖,其中用户可见的构造函数提供运行时默认实现,但是这要由我的测试来设置自己的容器.我没有考虑过这个问题,但似乎这与我现在的工作水平相同:每次测试必须初始化3-5个依赖项的测试.

通常情况下,我会自己尝试很多东西,看看有什么疼.我目前处于严格的期限之下,所以在编写代码时我没有太多时间进行实验; 我只是在短暂的时间内思考这个问题并且没有太多的论文.我确定其他人也遇到过类似的问题,所以如果我不需要重新发明轮子那就太好了.

还有其他人攻击过这个问题吗?是否有一些战略可以满足这些需求?由于我的经验不足,我只是一个新手和过于复杂的事情吗?如果是后者,我会喜欢你想分享的任何资源来解决我的无知.

更新:

我想回应Mark Seeman的回答,但它需要比评论字段允许的更多字符.

我已经玩弄了演示模型模式.在这种情况下,视图是公共控件类,每个视图都有一个或多个控制器类.当在控件上触发某个UI事件时,它执行的唯一逻辑是决定需要调用哪些控制器方法.

探索这种设计的简短表达是我的控制器类与它们的视图紧密耦合.根据DI容器使用松散耦合代码的说法,我正在阅读"错误的工作工具".我可能能够设计一个更松散耦合的架构,此时DI容器可能更容易使用.但这需要一些重大的努力,而且需要对已发布的代码进行大修; 我会不得不尝试新的东西,然后匆匆走近旧的东西.这是另一天的问题.

为什么我甚至想要注入强耦合类型而不是使用本地默认值?一些接缝旨在成为高级用户的可扩展点.我必须测试涉及不正确实现的各种场景,并验证我是否符合我的合同; 模拟对象非常适合.

对于目前的设计,克里斯巴拉德关于"穷人的DI"的建议是我或多或少关注的,对于我的强耦合类型,这只是很多繁琐的设置.我有这个愿景,我能够将所有这些乏味的东西推到一些DI容器设置方法中,但是我越努力证明这种方法,我就越相信我会变成我试图用大锤挂图片.

我会等待24小时左右,看看在接受之前是否进一步讨论.

c# testing inversion-of-control

8
推荐指数
2
解决办法
593
查看次数

设置ViewModel属性是否在Xamarin Forms中具有线程关联?

前几天,在代码审查中,我看到了一些关于从工作线程设置属性的安全性的问题.一位同事发表了评论,"此属性绑定到UI,数据绑定是线程安全的."

我一直在使用XF,但总是认为这不是真的:如果我想更新绑定到UI的ViewModel属性,我必须在UI线程上进行这些更改.我只花了几分钟探索文档,除了直接操作BindableProperties具有线程关联性之外,我没有看到明显的答案.如果那是阻止UI线程执行,那对我来说也很重要.

我可以制作一个项目来自己测试,但这些问题似乎总是间歇性的,所以我想知道我只是错过了正确的文档.

(这与调查崩溃有关,我们看到主要发生在Xamarin调用堆栈中.我们从工作线程引发事件,VM处理该事件并更新一些属性.如果这是为UI线程安排的,可能会有我们没有准备好一些交错问题,而且我更接近于解决崩溃问题.如果它没有安排用于UI线程......我很惊讶它的工作时间很长.)

mvvm xamarin.forms

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

WPF路由命令是解决问题还是使问题恶化?

据我所知,Command模式的目标是帮助将UI交互与应用程序逻辑分开.使用正确实现的命令,单击"打印"菜单项可能会产生一系列交互,如下所示:

(button) ---click executes command----> (command) ---calls Print() in app logic ---> (logic)
Run Code Online (Sandbox Code Playgroud)

这鼓励您将UI与应用程序逻辑分开.

我一直在研究WPF命令,在大多数情况下,我看到他们是如何实现这种模式的.但是,我觉得在某种程度上它们使命令模式变得复杂,并设法以不鼓励将UI与应用程序逻辑分离的方式实现它.

例如,考虑这个简单的WPF窗口,它有一个按钮将文本粘贴到文本框中:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Window.CommandBindings>
        <CommandBinding Command="ApplicationCommands.Paste"
                        Executed="CommandBinding_Executed"/>
    </Window.CommandBindings>
    <StackPanel>
        <TextBox x:Name="txtData" />
        <Button Command="Paste" Content="Paste" />
    </StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)

这是代码隐藏:

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            ApplicationCommands.Paste.Execute(null, txtData);
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

我从命令中获得了什么?在我看来,我可以轻松地将命令绑定事件处理程序中的代码放入按钮的Click事件中.当然,现在我可以将多个UI元素与粘贴命令相关联,我只需要使用一个事件处理程序,但是如果我想粘贴到几个不同的文本框呢?我必须使事件处理程序逻辑更复杂或编写更多的事件处理程序.所以现在,我觉得我有这个:

(button) ---executes Routed Command---> (Window) ---executes command …
Run Code Online (Sandbox Code Playgroud)

.net wpf routed-commands

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

如何覆盖两个Xamarin Forms布局,以便两者都可以接收触摸输入?

(我最初在Xamarin论坛上发布了这个,但后来我决定在这里得到更快的答案?)TL; DR:有些布局会计算透明背景上的点击,其他布局则不会.在容器上设置InputTransparent为其所有子项设置它,我觉得孩子应该能够覆盖父项.我需要创建覆盖另一个元素的元素,并通过透明区域传递水龙头,但仍然有可点击的按钮.当我尝试使用网格时,它不起作用.我不想回到AbsoluteLayouts.我现在主要在iOS工作,我不太确定它是不是Android的问题.Windows Phone/UWP不在桌面上.

更长的版本:

我正在重写一些在较旧的Xamarin Forms(我认为1.3)中运行正常的布局.我们最近升级到2.1,它对布局代码的错误决定造成了严重破坏.我的任务是更新布局以表现自己.虽然我认识2.2已经发布,但我只是尝试升级,我输入的所有内容在该版本中也是如此,所以它不是2.1和2.2的问题,或者至少如果做了一些改进他们没有帮助我.

它是一个地图应用程序,因此所有布局的核心都是昂贵的,不稳定的OpenGL元素.这个元素非常不喜欢被重新定义,所以我采用了类似于这个虚构的XAML的布局:

<ContentPage>
    <CustomLayout>
        <OurHeaderControl /> 
        <TheMapControl /> 
        <OurFooterControl /> 
        <MapOverlay /> 
    </CustomLayout>
</ContentPage
Run Code Online (Sandbox Code Playgroud)

"MapOverlay"的目的是通过在页眉/页脚区域和/或地图上添加Xamarin元素来实现我们的工作流程.例如,一个布局会在页脚上方的底部添加一个方向列表,因此它显示的地图空间较小.自定义布局理解这一点并在叠加后布局地图,以便它可以请求正确的地图边界.

在这种布局中,我无法点击MapOverlay结束的任何内容.我可以把它变成InputTransparent并点击那些东西,但是它的所有子节点也都是不可点击的.在旧版面中不是这样.

这是我在旧布局和新布局之间看到的唯一区别:

旧的布局是AbsoluteLayouts的一个复杂的混乱.它看起来像这样,我没写它:

<ContentPage>
    <AbsoluteLayout> // "main layout"
        <AbsoluteLayout> // "map layout"
            <Map /> // An AbsoluteLayout containing the OpenGL view.
        </AbsoluteLayout>
        <AbsoluteLayout> // "child layout"
            <SubPage /> // An AbsoluteLayout
        </AbsoluteLayout>
    </AbsoluteLayout>
</ContentPage>
Run Code Online (Sandbox Code Playgroud)

主布局包含AbsoluteLayouts以约束子视图.一个子视图本身就是一个AbsoluteLayout,它包含Map和一些与之关联的其他元素.另一个子项是叠加层,它始终是一个AbsoluteLayout,其中包含与该叠加层相关的元素.这些布局都以周期相互引用,并在布局事件发生变化时相互更新.这是一个迷人的乒乓球,最终落户.通常.有时候事情就会消失.显然我有一个改写它的原因.

但我可以点击我需要在每一层点击的内容,但我没有得到.

所以,让我们谈谈我需要做些什么,也许可以弄清楚它是否是一个错误,为什么它不起作用,或者它是否与其他布局一起使用是巧合.这是一个非XAML页面布局,演示了我的项目源于你不能在共享库中使用XAML的日子:

我需要能够点击此UI中的两个按钮并让它们做出响应.

public class MyPage : ContentPage {
    public MyPage() {

        var mainLayout = new AbsoluteLayout();

        // Two buttons will be overlaid.
        var overlaidButton …
Run Code Online (Sandbox Code Playgroud)

xamarin.forms

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

NuGet 如何决定将包目录放在哪里?

我正在处理少数 Xamarin Forms 项目和生成多目标 Xamarin 包的项目。我花了一天的时间努力让其中一个项目在 Azure DevOps 中正常运行,但我放弃了。

当我在本地处理一个特定的单元测试项目时,它会设置以下目录结构:

+ ProjectName
    + bin
    + obj
    + ...
+ packages
    + <nuget packages here>
Run Code Online (Sandbox Code Playgroud)

这种结构在项目文件的部分中表现出来,如下所示:

  <Import Project="..\..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props')" />
  <Import Project="..\..\packages\NUnit.3.12.0\build\NUnit.props" Condition="Exists('..\..\packages\NUnit.3.12.0\build\NUnit.props')" />
Run Code Online (Sandbox Code Playgroud)

项目文件的另一部分取决于此:

  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('..\..\packages\NUnit.3.12.0\build\NUnit.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit.3.12.0\build\NUnit.props'))" />
    <Error Condition="!Exists('..\..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props'))" />
  </Target>
Run Code Online (Sandbox Code Playgroud)

当我在本地构建它时,一切都很好。项目建立。测试通过。当我在 Azure …

nuget xamarin.forms azure-devops azure-pipelines

5
推荐指数
0
解决办法
298
查看次数