0

我正在尝试对 Xamarin.iOS 项目中的一些代码进行单元测试,但出现无法解决的编译器错误。有人对如何解决错误有建议吗?

在单个解决方案中,我有一个用于我的应用程序的非 UI 部分的 Xamarin.iOS 项目和另一个 Xamarin.iOS 单元测试项目。我正在测试 Parse 作为后端,但想从我的大多数应用程序中隐藏它,所以我添加了一个扩展方法,它将我的 User 模型转换为 ParseUser 对象。当我尝试在我的单元测试项目中使用扩展方法时,我收到以下错误:

/Matchup/MatchupXplatformTests/ParseHelperTests.cs(27,27):错误 CS1061:类型MatchupXplatform.Models.User' does not contain a definition forToParseUser' 并且找不到扩展方法ToParseUser' of typeMatchupXplatform.Models.User'。您是否缺少程序集参考?(CS1061) (MatchupXplatformTests)

这是我要运行的代码:

[Test]
public void Pass ()
{
    var user = new User () {
        Username = "me@you.com",
        Email = "me@you.com", 
        Password = "meyoucom", 
        Name = "Me You"
    };

    ParseUser pUser = user.ToParseUser (); // <- Error here

    Assert.Equals (user.Username, pUser.Username);
}

令人困惑的部分是,在上面的代码片段中,Xamarin Studio 中的代码完成解析了 .ToParseUser() 扩展方法,提供了有关该方法的准确信息,并且可以找到该方法的声明,但编译器仍然会生成错误。

我确保单元测试项目引用了另一个项目,单元测试文件具有用户模型和扩展方法类的 using 语句。我还验证了下面的代码在后端项目中有效,但在单元测试项目中无效。

Xamarin Studio:版本 4.1.3(内部版本 66) Xamarin.iOS:版本:6.3.6.76(试用版)


更新:根据要求,附加代码:

MatchupXplatform/Models/User.cs:

using System;
using System.Runtime.Serialization;

namespace MatchupXplatform.Models
{
    public class User
    {
        [DataMember(Name = "username")]
        public string Username { get; set; }

        [DataMember(Name = "email")]
        public string Email { get; set; }

        [DataMember(Name = "password")]
        public string Password { get; set; }

        [DataMember(Name = "name")]
        public string Name { get; set; }
    }
}

MatchupXplatform/ParseHelper.cs:

using System;
using System.Runtime.Serialization;
using System.Reflection;
using System.Collections.Generic;
using Parse;
using MatchupXplatform.Models;

namespace MatchupXplatform
{
    internal static class ParseHelper
    {
        public static ParseUser ToParseUser (this User user) 
        {
            var pUser = new ParseUser ();

            try {
                var pObj = (ParseObject)pUser;
                user.UpdateParseObject (ref pObj);
                return pUser;

            } catch (ParseException pe) {
                Console.WriteLine (pe);
                return null;
            }

        }

        public static User ToUser (this ParseUser pUser)
        {
            return pUser.ToParseObject<User> ();
        }
    }
...
}

MatchupXplatformTests 参考:Parse.iOS.dll MatchupXplatform monotouch MonoTouch.NUnitLite System System.Core System.Xml

MatchupXplatformTests/ParseHelperTests.cs:

using System;
using NUnit.Framework;
using MatchupXplatform;
using MatchupXplatform.Models;
using Parse;

namespace MatchupXplatformTests
{
    [TestFixture]
    public class ParseHelperTests
    {
        [TestFixtureSetUp]
        public void Setup ()
        {
            ParseStarter.Initialize ();
        }

        [Test]
        public void Pass ()
        {
            var user = new User () {
                Username = "me@you.com",
                Email = "me@you.com", 
                Password = "meyoucom", 
                Name = "Me You"
            };

            ParseUser pUser = user.ToParseUser (); // <- Error here

            Assert.Equals (user.Username, pUser.Username);
        }
    }
}

在为此苦苦挣扎了几个小时之后,我最终只是将此功能封装在一个服务方法中,然后从单元测试中调用该方法。这很好,但我很好奇为什么会产生错误。

4

1 回答 1

1

看起来您的扩展方法在您的 MatchupXplatform 程序集内部,并且对您的单元测试不可见。

于 2013-06-15T09:39:09.223 回答