标签: vs-unit-testing-framework

创建类访问器的实例

我目前正在编写一个单元测试框架,它最终将运行用Visual Studio编写的标准单元测试.框架目前无法正常使用访问者.请考虑以下测试方法:

[TestMethod()]
public void TestMethod()
{
      ExampleMethods_Accessor target = null;
      target = new ExampleMethods_Accessor();
      target.SomeMethod();
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,访问者已由Visual Studio生成.使用Visual Studio的单元测试环境运行时,单元测试工作正常.但是,我想从我的框架内调用TestMethod().在"target = new ExampleMethods_Accessor()"行中,抛出以下异常:

"Proband.ExampleMethods_Accessor"的类型初始化程序引发了一个例外.

内部异常:

无法加载文件或程序集:Proband,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null ...

有谁知道微软单元测试框架如何调用单元测试?我在想它可能是由于缺少TestContext对象.在我的情况下,这是"空".在Visual Studio中启动单元测试时,TestContext对象包含大量信息.可能是,我需要正确地初始化它吗?怎么需要初始化?

谢谢你的帮助,克里斯蒂安

编辑:

我一直在试验访问者的工作方式.我使用ILSpy来查看Proband_Accessor.dll中生成了什么代码.事实证明导致异常的指令是:

SomeClass_Accessor.m_privateType = new PrivateType("Probant, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Probant.SomeClass");
Run Code Online (Sandbox Code Playgroud)

我将我的单元测试代码修改为这样(仅用于测试):

    [TestMethod()]
    [DeploymentItem("Proband.dll")]
    public void SomeMethodTest()
    {
        ExampleMethods_Accessor target = null;
        ExampleMethods c = null;

        try
        {
            Assembly.Load("Proband, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); // this works fine
            PrivateType tx = new PrivateType(typeof(ExampleMethods)); // this works fine …
Run Code Online (Sandbox Code Playgroud)

.net c# unit-testing vs-unit-testing-framework

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

使用siteoforigin pack Uri对WPF应用程序进行单元测试

我有一些单元测试,我正在为WPF应用程序编写,尽管我试图避免它,我有一些正在测试的代码实例化View.一旦实例化视图,就会评估所有标记扩展,样式等.为了解决这个问题,我在初始化测试程序集时创建了一个虚拟应用程序并注册了所有必需的资源:

[TestClass]
public class AssemblyInitialize
{
    [AssemblyInitialize]
    public static void SetupTestAssembly(TestContext context)
    {
        if (Application.Current == null)
            new Application();

        var resources = new List<string>
            {
              "pack://application:,,,/AssemblyName;component/ResourceDictionary.xaml"
            };

       foreach(var resource in resources)
       {
           var uri = new Uri(resource);
           var dictionary = new ResourceDictionary { Source = uri };
           Application.Current.Resources.MergedDictionaries.Add(dictionary);
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

我过去曾经使用过这种方法,而且运行正常.

我用这种方法遇到了一个小麻烦.我有一些资源使用pack:// siteoforigin:在包Uri中,当测试实例化这个视图时,我收到一个关于无法解析文件的错误.

XAML:

<ResourceDictionary
   xmlns="...">

   <ImageBrush 
      x:Key="ResourceName"
      ImageSource="pack://siteoforigin:,,,/Resources/image.png" 
      />
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)

错误信息:

 Could not find a part of the path 'C:\\Solution\\TestResults\\Workspace_2012-03-01 14_54_29\\Resources\\image.png'
Run Code Online (Sandbox Code Playgroud)

我已将Resources目录添加为部署项,并且我已确认该图像是TestRun输出目录.似乎AppDomain在我的测试程序集的位置上方运行一个文件夹,因为该文件实际位于:

c:\ Solution\TestResults\Workspace_2012-03-01 …

wpf unit-testing mstest vs-unit-testing-framework

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

在DataTestMethod的每个DataRow之前和之后,TestInitialize和TestCleanup均未运行

在下面,您可以在Window Phone Unit Test App中看到一些用Mstest编写的代码。
我有一个称为TestMethod1的普通TestMethod 和一个名为TestMethod2的DataTestMethod ,它具有三个DataRows:

[TestClass]
public class UnitTest1
{
    [TestInitialize]
    public void Setup()
    {
        Debug.WriteLine("TestInitialize");
    }

    [TestMethod]
    public void TestMethod1()
    {
        Debug.WriteLine("TestMethod1");
    }

    [DataTestMethod]
    [DataRow("a")]
    [DataRow("b")]
    [DataRow("c")]
    public void TestMethod2(string param)
    {
        Debug.WriteLine("TestMethod2 param=" + param);
    }

    [TestCleanup]
    public void TearDown()
    {
        Debug.WriteLine("TestCleanup");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果以调试模式运行测试(在Visual Studio中为Ctrl + R,Ctrl + T),则会在输出面板中看到以下内容:

TestInitialize
TestMethod1
TestCleanup
TestInitialize
TestMethod2 param = c
TestMethod2 param = a
TestMethod2 param = b
TestCleanup

如您所见,TestInitialize仅执行了两次:一次在TestMethod1之前,一次在带有参数c的TestMethod2之前。
对于TestCleanup来说是相同的,它在TestMethod1之后执行一次,并在最后一次执行一次。

我希望无论测试是TestMethod还是DataTestMethod,在每次测试之前和之后都要执行TestInitialize和TestCleanup。否则,一项测试的执行会影响下一项测试。

我希望它是这样的: …

c# unit-testing windows-phone vs-unit-testing-framework windows-phone-8

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

以编程方式创建 MSTest 单元测试

我正在寻找一种使用 MSTest 以编程方式创建单元测试的方法。我想循环遍历一系列配置数据并根据这些信息动态创建测试。配置数据在编译时不可用,并且可能来自外部数据源,例如数据库或 XML 文件。场景:将配置数据加载到测试工具中并循环访问数据,同时为每个元素创建新测试。希望单独报告每个动态创建的测试(成功/失败)。

.net c# unit-testing mstest vs-unit-testing-framework

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

Assert.AreEqual 如何比较 .net 单元测试中的两个对象?

我正在为我编写的一些 .net 代码编写单元测试。

我熟悉这样编写代码:

int expected = 10;
int actual = multiplyByTwo(5);
Assert.AreEqual(expected, actual);
Run Code Online (Sandbox Code Playgroud)

在参数是整数的情况下,很清楚期望代码做什么。

当传入的参数是对象时,代码会做什么?

如果我编写了一个名为 的自定义类MyClass,那么如何控制Assert.AreEqual类型对象的通过和失败时间MyClass?

.net unit-testing assert vs-unit-testing-framework

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

无法使用ClassInitialize方法执行类

我面临一个尴尬的局面 - 所有具有[ClassInitialize]方法的测试类都无法执行内部的所有测试方法.

例:

[TestClass]
public class ChargeAccountServiceTests
{
    private static PrivateType ChargeAccountService_Accessor;

    [ClassInitialize]
    public static void InitializeClass(Microsoft.VisualStudio.TestTools.UnitTesting.TestContext context)
    {
         ChargeAccountService_Accessor = new PrivateType(typeof(ChargeAccountService));
    }

    [TestMethod]
    public void TestFixOMRHappySHA()
    {
          //TEST LOGIC
    }
}
Run Code Online (Sandbox Code Playgroud)

导致测试代理抛出以下异常:

Test Name:  TestFixOMRHappySHA
Test FullName:  ChargeAccountServiceTests.TestFixOMRHappySHA
Test Source:    \ChargeAccountServiceTests.cs : line 22
Test Outcome:   Failed
Test Duration:  0:00:00
Run Code Online (Sandbox Code Playgroud)

结果消息:

方法ChargeAccountServiceTests.InitializeClass具有错误的签名.参数1应为Microsoft.VisualStudio.TestTools.UnitTesting.TestContext类型.

这个测试几天前就已经开始了.测试项目目标是.NET 3.5

c# unit-testing mstest visual-studio vs-unit-testing-framework

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

构建从单元测试执行开始

我正在使用VS2013 Ultimate和Update 2 RC.

我的问题如下:每当我开始单元测试时,都会构建单元测试的所有相关项目.即使依赖关系没有改变.这在开发过程中花费了大量时间,我不知道如何停用它.

我正在使用Visual Studio单元测试.如果找到建议设置工具 - >选项 - >项目和解决方案 - >构建和运行 - >运行,.. - >从不构建.然而,这对我不起作用.

我也发现了一个与我类似的问题,微软称它是固定的.对我来说,不是整个解决方案得到重建,而是每一个依赖.所以它是不同的.不过这里是链接:

https://connect.microsoft.com/VisualStudio/feedback/details/809777/running-a-single-unit-test-in-visual-studio-2013-causes-entire-solution-to-be-built

也许我错过了一个选项.也许它必须重建,因为我错过了一些东西.另一种选择是VS2013仍然有缺陷.但后来我觉得别人会遇到同样的问题.

msbuild unit-testing vs-unit-testing-framework visual-studio-2013

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

静态库(.lib) Visual Studio 的代码覆盖率

我有一个静态库(.lib)。我的测试项目中的测试用例是在Visual Studio中,TC引用了许多静态库函数。测试用例有效并且一切顺利。但我无法获取 .lib 内代码的代码覆盖率,因为我无法添加仪器 .lib。有没有办法获得 .lib 的代码覆盖率?

c++ static-libraries visual-studio vs-unit-testing-framework

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

TestContext.AddResultFile 有时不工作

我用的是VS2010。

TestContext.AddResultFile()在我的单元测试期间产生不稳定的行为。有时它会将文件添加到报告中,有时则不会。一次又一次运行相同的基本虚拟测试后,在大约 50% 的情况下,文件不会添加到报告中。

还有其他人注意到这一点吗?解决办法是什么?

c# unit-testing mstest visual-studio-2010 vs-unit-testing-framework

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

我可以通过编译器选项传递VisualStudio Edition名称吗?

我正在使用Microsoft.QualityTools.Testing.Fakes来模拟一些单元测试.

但此程序集仅适用于使用VisualStudio Ultimate的用户.

具有其他版本(专业版)的用户无法构建和运行此测试项目,并且在其环境中出现错误.

所以我创建了一个编译器指令来处理这个问题:

#define Ultimate

#if Ultimate
using Microsoft.QualityTools.Testing.Fakes;
#endif
Run Code Online (Sandbox Code Playgroud)

我的测试方法是:

#if Ultimate
    using (ShimsContext.Create())
    {
        ... My code
    }
#else
    Assert.Inconclusive("This test needs VS Ultimate to run");
#endif
Run Code Online (Sandbox Code Playgroud)

这很有效,但用户仍需要注释/取消注释定义行.

那么,有没有办法将我的VS版传递给编译器?或者还有另一种方法吗?

c# unit-testing compiler-options visual-studio vs-unit-testing-framework

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