相关疑难解决方法(0)

使用Moq测试抽象类

我正在尝试对抽象类中的方法运行单元测试.我浓缩了下面的代码:

抽象类:

public abstract class TestAb
{
    public void Print()
    {
        Console.WriteLine("method has been called");
    }
}
Run Code Online (Sandbox Code Playgroud)

测试:

[Test]
void Test()
{
    var mock = new Mock<TestAb>();
    mock.CallBase = true;
    var ta = mock.Object;
    ta.Print();
    mock.Verify(m => m.Print());
}
Run Code Online (Sandbox Code Playgroud)

信息:

Method is not public
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?我的目标是使用Moq框架测试抽象类中的方法.

c# testing nunit unit-testing moq

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

在C#中模拟非虚方法

我正在尝试测试我使用模拟制作的一些类,但我已经看到c#中的所有免费模拟框架都无法模拟非虚方法(如果它不在接口中).

但是,有可以做到这一点的TypeMock,所以它是可能的.任何人都可以展示如何做到这一点?如果我能完成这项任务,我甚至可能会尝试为开源框架做出贡献.

提前致谢

.net c# testing typemock mocking

11
推荐指数
2
解决办法
3703
查看次数

自动化测试中的DbContext.ChangeTracker会抛出SQLException

我正在为一个我正在努力的项目编写自动化测试,以便更熟悉MVC,EntityFramework(代码优先),单元测试和Moq.

我的类中有一个部分,Repository它设置了LastModified我的模型的一个区域,只要Repository.SaveChanges()控制器调用它就像这样工作(MyModelBase是一个基类):

public void RepoSaveChanges()
{
    foreach(var entry in _dbContext.ChangeTracker.Entities().Where(e => e.State == EntityState.Modified))
    {
        MyModelBase model = entry.Entity as MyModelBase;
        if (model != null)
        {
            model.LastModified = DateTime.Now;
        }
    }
    _dbContext.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

这在正常在线环境中的应用程序运行时期间工作正常,但在测试方法中运行时会中断.我使用Moq来模拟DbContext中的DbSets并设置我的测试数据.

这是我的奇怪部分:我的单元测试运行正常(通过)但它们实际上并没有真正进入foreach循环 - 它在ChangeTracker.Entities()被访问时挂起并退出循环,向下跳转到_dbContext.SaveChanges().没有错误.

但是,在与我共享项目的朋友的机器上,ChangeTracker.Entities()访问时会收到SQLException .我确实在VS2015中检查了SQLExceptions,并且没有输出或其他异常指示.

结果StackTrace:
在System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,UInt32 waitForMultipleObjectsTimeout,Boolean allowCreate,Boolean onlyOneCheckConnection,DbConnectionOptions userOptions,DbConnectionInternal&connection)....

结果消息:
测试方法MyProject.Tests.TestClasses.MyControllerTests.TestCreate引发异常:System.Data.SqlClient.SqlException:建立与SQL Server的连接时发生与网络相关或特定于实例的错误.服务器未找到或无法访问.验证实例名称是否正确,以及SQL Server是否配置为允许远程连接.(提供程序:SQL网络接口,错误:26 - 查找指定的服务器/实例时出错)

最后,我的问题是:有没有办法使用Moq模拟ChangeTracker(我怀疑不是来自之前的调查),还是我可以采取另一种方法来RepoSaveChanges()自动设置属性?如果没有访问,ChangeTracker.Entities()我需要有更新逻辑来LastModified为每个拥有它的模型类型设置字段.同样,我觉得避免使用该API /框架的一部分,因为测试是顽固的并不理想.

有没有人知道为什么没有抛出/不能在我的机器上捕获SQLException?或者有关如何ChangeTracker.Entities()在单元测试中使用的任何建议?LastModified作为最后的手段,我只会在所有模型和控制器上单独设置属性.

更新: …

c# asp.net-mvc unit-testing entity-framework moq

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

如何使用非虚函数对对象进行单元测试模拟

我有一个使用 wsdl.exe 工具生成的 C# 类,如下所示:

public partial class SoapApi : System.Web.Services.Protocols.SoapHttpClientProtocol
{
    public SOAPTypeEnum AskServerQuestion()
    {
        object[] results = return this.Invoke("AskServerQuestion");
        return (SOAPTypeEnum) results[0];
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一些围绕此的瘦包装器代码,用于跟踪结果等。是否可以使用任何对象模拟框架来制作一个假的 SoapApi 类,并为每个对瘦包装器函数的调用返回可预测的结果?

我无法将 AskServerQuestion() 函数设为虚拟函数,因为它是由 wsdl.exe 工具自动生成的。

c# unit-testing mocking

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

使用 Moq 模拟 HttpWebRequest 接受

我正在使用 Moq 来模拟 HttpWebRequest。我能够模拟标题和方法,但是当我尝试模拟接受时它会爆炸。

代码是:

 Mock<HttpWebResponse> response = new Mock<HttpWebResponse>(MockBehavior.Loose);
 Mock<HttpWebRequest> request = new Mock<HttpWebRequest>();
 request.Setup(s => s.GetResponse()).Returns(response.Object);
 request.Setup(m => m.Method).Returns("GET");
 request.Setup(h => h.Accept).Returns("application/x-protobuf");
Run Code Online (Sandbox Code Playgroud)

例外是:

 System.NotSupportedException was unhandled by user code  
 HResult=-2146233067   Message=Invalid setup on a non-virtual
 (overridable in VB) member: h => h.Accept   Source=Moq   StackTrace:
        at Moq.Mock.ThrowIfCantOverride(Expression setup, MethodInfo method)
        at Moq.Mock.<>c__DisplayClass1f`2.<SetupGet>b__1e()
        at Moq.PexProtector.Invoke[T](Func`1 function)
        at Moq.Mock.SetupGet[T,TProperty](Mock mock, Expression`1 expression, Func`1 condition)
        at Moq.Mock.<>c__DisplayClass1c`2.<Setup>b__1b()
        at Moq.PexProtector.Invoke[T](Func`1 function)
        at Moq.Mock.Setup[T,TResult](Mock mock, Expression`1 expression, Func`1 condition)
        at Moq.Mock`1.Setup[TResult](Expression`1 expression)
        at HarmonyTests.MockWebRequestCreate.CreateTestRequest(Stream …
Run Code Online (Sandbox Code Playgroud)

c# moq

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