标签: moq

Moq:设置没有setter的属性?

我有以下课程:

public class PairOfDice
{
    private Dice d1,d2;
    public int Value 
    {
       get { return d1.Value + d2.Value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想PairOfDice在我的测试中使用a 返回值1,虽然我在我的真实骰子中使用随机值:

[Test]
public void DoOneStep ()
{
    var mock = new Mock<PairOfDice>();
    mock.Setup(x => x.Value).Return(2);
    PairOfDice d = mock.Object;
    Assert.AreEqual(1, d.Value);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是我收到了Invalid setup on non-overridable member错误.在这种情况下我该怎么办?

请注意,这是我第一次尝试实施单元测试.

c# unit-testing properties moq

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

使用NET40-NoCastle时为什么'Moq.Proxy.CastleProxyFactory'类型初始化程序异常?

所以我几乎逐字地复制了Moq主页中的示例代码,并且获得了城堡代理异常.

这是我的代码(作为一个更容易的样本的控制台应用程序)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Moq;

namespace MoqTestConsole
{
    public interface ILoveThisFramework
    {
        bool DownloadExists(string s);
    }

    class Program
    {
        static void Main(string[] args)
        {
            Mock<ILoveThisFramework> mock = new Mock<ILoveThisFramework>();

            // WOW! No record/replay weirdness?! :)
            mock.Setup(framework => framework.DownloadExists("2.0.0.0")).Returns(true);

            // Hand mock.Object as a collaborator and exercise it, 
            // like calling methods on it...
            ILoveThisFramework lovable = mock.Object;
            bool download = lovable.DownloadExists("2.0.0.0");

            // Verify that the given method was indeed called with …
Run Code Online (Sandbox Code Playgroud)

c# testing unit-testing moq mocking

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

尝试使用Moq模拟IObjectSet时出现TypeLoadException

我有以下设置代码:

MockOf<IObjectSet<Dummy>>().Setup(c => c.AddObject(dummy)).Verifiable();
MockOf<IObjectContextWrapper>().Setup(c => c.GetObjectSet<Dummy>()).Returns(MockOf<IObjectSet<Dummy>>().Object);
Run Code Online (Sandbox Code Playgroud)

其中Dummy是一个空类定义,dummy是一个Dummy.MockOf<T>()是基类上的模拟管理功能,它基本上确保每次在类型上调用它时,它返回相同的模拟实例.

包含此设置代码的测试失败,TypeLoadException并显示以下消息:

System.TypeLoadException:从程序集'DynamicProxyGenAssembly2,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = a621a9e7e5c32e69'输入'IObjectSet`1Proxy389e220f10aa4d9281d0b9e136edc1d4'试图实现一个不可访问的接口.

在System.Reflection.Emit.TypeBuilder.TermCreateClass(RuntimeModule模块,Int32 tk,ObjectHandleOnStack类型)
的System.Reflection.Emit.TypeBuilder.CreateTypeNoLock()
在System.Reflection.Emit.TypeBuilder.CreateType()
在Castle.DynamicProxy.Generators Castle.DynamicProxy.Generators.InterfaceProxyWithTargetGenerator.GenerateCode(
类型为proxyTargetType,Type []接口,ProxyGenerationOptions选项)
的.Emitters.AbstractTypeEmitter.BuildType()在Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(类型interfaceToProxy,Type [] additionalInterfacesToProxy,ProxyGenerationOptions选项, IInterceptor []拦截器)
在Moq.Mock 1.InitializeInstance() 在Moq.Mock`1.get_Object()1.<InitializeInstance>b__0()
at Moq.Mock


在RepositoryTest.cs中的OddEnds.Tests.Data.EntityFramework.RepositoryTest.Delete_DeletesObjectFromObjectSet():第43行

我已System.Data.Objects在测试项目和正在测试的类所在的项目中导入并引用了System.Data.Entity.dll和Microsoft.Data.Entity.CTP.dll.构建成功,没有错误,警告或消息(除了一些与代码合同有关的...)

我该如何解决?

typeloadexception moq

17
推荐指数
2
解决办法
3897
查看次数

无法为接口模拟传递构造函数参数

当我调试代码并使用mockLessonplannerAFactory创建读取行时,我得到错误:

无法为接口模拟传递构造函数参数.

var mockSchoolclassCodeService = new Mock<ISchoolclassCodeService>();
var mockDateService = new Mock<IDateService>();
var mockLessonplannerAFactory = new Mock<ILessonplannerAFactory>(mockDateService.Object);
var mockLessonplannerBFactory = new Mock<ILessonplannerBFactory>(mockDateService.Object);

var service = new TimeTableService(mockUnitOfWork.Object, mockLessonplannerAFactory.Object, mockLessonplannerBFactory.Object, mockSchoolclassCodeService.Object);
Run Code Online (Sandbox Code Playgroud)

我的TimeTableService只接受接口类型的实例.但是mockLessonplannerAFactory和BFactory ......想在他们的构造函数中也传递一个IDateService.

我的代码出了什么问题?

c# moq

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

Moq:回调无效.使用参数设置方法不能使用参数调用回调

我正在尝试使用moq编写单元测试.这是我的单元测试代码

        var sender = new Mock<ICommandSender>();
        sender.Setup(m => m.SendCommand(It.IsAny<MyCommand>(), false))
              .Callback(delegate(object o)
              {
                  var msg = o as MyCommand;
                  Assert.AreEqual(cmd.Id, msg.Id);
                  Assert.AreEqual(cmd.Name, msg.Name);
              })
              .Verifiable();
Run Code Online (Sandbox Code Playgroud)

SendCommand接受一个对象和可选的布尔参数.而MyCommand来自ICommand.

void SendCommand(ICommand commands, bool idFromContent = false);
Run Code Online (Sandbox Code Playgroud)

测试运行时,我看到错误

System.ArgumentException : Invalid callback. Setup on method with parameters (ICommand,Boolean) cannot invoke callback with parameters (Object).
Run Code Online (Sandbox Code Playgroud)

我想检查邮件的内容是否是我发送的内容.我搜索了论坛,发现了这个问题的几个不同变体,但那些没有帮助.任何帮助是极大的赞赏.

moq

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

Moq异步回调失败,有多个参数

我正在尝试锻炼,如果它是我做错了,或者是moq或NUnit中的问题.我正在调用soap端点,我的服务引用正在生成同步和异步方法.我正在打电话,看起来像是:

public async Task DoThisAsync(idnameobject myobj, int id)
{
    await ws.DoSomethingAsync(myobj, id);
}
Run Code Online (Sandbox Code Playgroud)

我正在设置我的moq来返回回调,所以我可以将我称之为Web服务的参数与之集成.我的测试看起来像:

var callback = new idnameobject();    

wsMock
.SetUp(w => w.DoSomethingAsync(It.IsAny<idnameobject>(), It.IsAny<int>())
.Callback<idnameobject, int>((obj, id) => callback = obj);

await myservice.DoThisAsync(myobj, id);

Assert.That(callback.Id, Is.EqualTo(myobj.Id));
Run Code Online (Sandbox Code Playgroud)

此时,我在调用my方法时得到一个空引用异常,该方法不包含堆栈跟踪中的任何信息.我只有Exception thrown: 'System.AggregateException' in mscorlib.dll输出.

奇怪的是,如果我从同步方法设置回调并更改我的方法来调用它,它就不会失败.

如果我调用只有一个参数的异步方法,它也不会失败.

如果有人有任何想法,请告诉我,因为我的测试不想改变我的方法,但理想情况下我希望我的测试确保我正确地调用Web服务.

c# tdd nunit asynchronous moq

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

在单元测试中模拟IMemoryCache

我正在使用asp net core 1.0和xunit.

我正在尝试为一些使用的代码编写单元测试IMemoryCache.但是每当我尝试在I中设置一个值时,IMemoryCache我都会得到一个Null参考错误.

我的单元测试代码是这样的:
IMemoryCache注入到我想要测试的类中.但是,当我尝试在测试中设置缓存中的值时,我得到一个空引用.

public Test GetSystemUnderTest()
{
    var mockCache = new Mock<IMemoryCache>();

    return new Test(mockCache.Object);
}

[Fact]
public void TestCache()
{
    var sut = GetSystemUnderTest();

    sut.SetCache("key", "value"); //NULL Reference thrown here
}
Run Code Online (Sandbox Code Playgroud)

这是班级测试......

public class Test
{
    private readonly IMemoryCache _memoryCache;
    public Test(IMemoryCache memoryCache)
    {
        _memoryCache = memoryCache;
    }

    public void SetCache(string key, string value)
    {
        _memoryCache.Set(key, value, new MemoryCacheEntryOptions {SlidingExpiration = TimeSpan.FromHours(1)});
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是......我需要以IMemoryCache某种方式设置吗?为DefaultValue设置一个值?当IMemoryCache被嘲笑什么是默认值?

c# unit-testing moq mocking asp.net-core

17
推荐指数
3
解决办法
8715
查看次数

如何在单元测试中使用Mock对象并仍使用代码覆盖率?

现在我开始将Mock对象的概念引入我的单元测试中.特别是我正在使用Moq框架.但是,我注意到的一件事是突然我使用这个框架测试的类显示代码覆盖率为0%.

现在我明白了,因为我只是在嘲笑这个类,它没有运行实际的类本身....但是我如何编写这些测试并让Code Coverage返回准确的结果呢?我是否必须编写一组使用Mocks的测试和一组直接实例化该类的测试.

也许我在没有意识到的情况下做错了什么?

这是我尝试单元测试一个名为"MyClass"的类的示例:

using Moq;
using NUnitFramework;

namespace MyNameSpace
{
    [TestFixture]
    public class MyClassTests
    {

        [Test]
        public void TestGetSomeString()
        {
            const string EXPECTED_STRING = "Some String!";

            Mock<MyClass> myMock = new Mock<MyClass>();
            myMock.Expect(m => m.GetSomeString()).Returns(EXPECTED_STRING);

            string someString = myMock.Object.GetSomeString();

            Assert.AreEqual(EXPECTED_STRING, someString);
            myMock.VerifyAll();

        }

    }

    public class MyClass
    {
        public virtual string GetSomeString()
        {
            return "Hello World!";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有谁知道我应该采取哪些不同的做法?

.net c# unit-testing code-coverage moq

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

Moq VerifySet(Action)替换过时的表达式编译错误

提到这个问题:

Moq如何替换过时的表达方式

我有以下内容:

[Test]
public void OnSearchRequest_ViewFiresEvent_EventIsHandled()
{
    // Arrange
    Mock<IViewUsers> view = new Mock<IViewUsers>();
    Users users = new Users(view.Object);

    // Act
    view.Raise(v => v.SearchForUsers += null, this, new SearchEventArgs());

    // Assert
    view.VerifySet(v=> v.SearchResult = It.IsAny<List<IUser>>());

}
Run Code Online (Sandbox Code Playgroud)

最初我有:

        // Assert
        view.VerifySet(v => v.SearchResult);
Run Code Online (Sandbox Code Playgroud)

但得到了警告:

'Moq.MockExtensions.VerifySet(Moq.Mock,System.Linq.Expressions.Expression>)'已废弃:'由VerifySet替换(Action)'

所以我找到了上面引用的问题,并将其更改为匹配,但现在我仍然得到了警告,最重要的是,在对VerifySet的调用中"v.SearchResult"上发生了一个硬错误:

表达式树可能不包含赋值运算符.

我不明白我是不正确地格式化这个 - 所以为什么它不认识到这是一个动作,因为另一个问题暗示它应该?

c# moq

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

使用MOQ同步方法测试EF异步方法

我有这个方法:

    public async Task DeleteUserAsync(Guid userId)
    {
        using (var context = this.contextFactory.Create())
        {
            var user = await context.Users.FirstOrDefaultAsync(x => x.Id.Equals(userId));

            if (user == null)
            {
                throw new Exception("User doesn't exist");
            }

            context.Users.Remove(user);

            await context.SaveChangesAsync();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我想测试一下.所以我创建了测试:

    [TestMethod]
    public async Task DeleteUsersSuccessfulCallTest()
    {
        // Arrange
        var id = Guid.NewGuid();
        var user = new User() { Id = id };

        var context = new Mock<IDashboardContext>();
        var usersDbSet = DbSetQueryMocking.GenericSetupAsyncQueryableMockInterfaceSet(new List<User> { user }.AsQueryable());
        context.Setup(x => x.Users).Returns(usersDbSet.Object);

        context.Setup(x => x.Users.Remove(user)).Returns(user).Verifiable();
        context.Setup(x => …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing asynchronous entity-framework moq

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