扩展方法不是由Xamarin编译器

时间:2013-06-10 03:59:02

标签: xamarin.ios

我正在尝试在Xamarin.iOS项目中对一些代码进行单元测试,但是我遇到了一个无法解决的编译器错误。任何人都有关于如何解决错误的建议?

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

  

/Matchup/MatchupXplatformTests/ParseHelperTests.cs(27,27):   错误CS1061:键入MatchupXplatform.Models.User' does not contain a definition for ToParseUser'并且找不到扩展方法ToParseUser' of type MatchupXplatform.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()扩展方法,提供了有关该方法的准确信息,并且可以找到该方法的声明,但编译器仍会生成错误。

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

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


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

MatchupXplatform /型号/ 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.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);
        }
    }
}

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

1 个答案:

答案 0 :(得分:1)

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